JPAの問題点
JPAには非常に期待している人も多いでしょう。私もその一人です。実際にプロジェクトで使ってみて、見えてきた問題点を書いてみます。JPAの実装としては、Hibernate3.2を使っています。
- 学習コストが高い。
- トラブルシューティングが難しい。
- SQLの扱いが貧弱。
- JPQLは、SQLのかなり貧弱なサブセットなので、SQLを使う必要がある場合もいろいろあるのですが、JPAのSQLの扱いは貧弱です。SQLの結果を単独のEntityにつめて返す場合はいいのですが、複数のEntityを返そうとするとObjectの配列に個々のEntityがつめられて返ってくるので、Employee emp = (Employee) obj[0];のような感じでキャストして使うのです。それってあんまりだよね。最悪は、Entity以外にマッピングする場合で、なんとObjectの配列で返ってくるのです。Long id = (Long) obj[0];String ename = (String) obj[1];なってやる必要があるなんて。超あんまり。KuinaDaoは、S2DaoのようにSQLの結果をDTOにマッピングできるので、このケースは大丈夫なのですが、素のJPAを使うときっと困るではないかと思います。
- 新規システム以外で使うのは難しい。
- パフォーマンスチューニングが後から発生する。
- View層におけるlazy loading問題
- 立ち上げ時の初期化が遅い
- 生産性がS2Daoより悪い
JPAを使って最も楽をするには、StatefulSessionBeanとExtendedなEntityManagerを使うことです。View層のlazy loadingの問題もないし、detachされたEntityをmergeする必要もないし、SessionBeanが生きている間は、一度アクセスしたEntityはキャッシュされているので、パフォーマンスも向上します。問題点は、一度アクセスしたエンティティをキャッシュしているので、メモリを大量に消費することです。現在のJPAでは、キャッシュを全部クリアするという大雑把なメソッドしか用意されていないので困り者です。また、StatefulSessionBeanをきちんと削除してあげないとキャッシュされたEntityが解放されないと言う問題もあります。これは、Seamでは、StatefulSessionBeanのライフサイクルを自動的に管理するので、解決されているように思えますが、ユーザが最後まで処理を行わずに、途中で処理を止めた場合は、StatefulSessionBeanが削除されずに残ってしまうのではないかと思います。Seamに詳しい人、間違っていたら教えてください。
結論を書くと、今のJPAは、かなりの問題を抱えています。素で使うのはお勧めしません。JPAは、JPAのことを良く知っているフレームワークと組み合わせることをお勧めします。今の時点で、JPAを使うのに良いと思うフレームワークは、Seasar2のEasy EnterpriseファミリーとSeamです。Easy Enterpriseファミリーは、SQLの問題もView層におけるlazy loading問題も解決しているのですが、最大の問題は、S2Hibernate-JPAとKuinaDaoが正式リリースされていないこと。早くリリースしてくださーーい。
Seamは、大量にメモリを使うことが苦にならないようなシステムなら、良いのではないでしょうか。SQLの扱いが貧弱な問題点は、HibernateのSessionを直に呼ぶことで解決できるでしょう。