shimashimaの日記: JPA(Java Persistence API)は美味しいか?
日記 by
shimashima
今参加しているプロジェクトでJPA(プロバイダはHibernate)を利用しており、私の担当はDBアクセス部分も含むのでJPAを実際にさわっている。11月頃よりさわりだしたので3ヶ月ちょっとになるが、実際に使ってみての感想(メリット/デメリット)を書いてみる。
メリット
- DB/オブジェクトの関連がほぼ自動化されるので開発効率はよい。
- 大抵のことはJQPLで済むのでSQLはほとんど必要ない。だが、JPQLはSQLの知識が無いとほぼ使えないのでSQLをしらない人には使いこなせない。
- EntityへのアノテーションからDDL生成が可能。もしくはDDLからEntityが生成可能。
- O/Rに関する情報はアノテーションで記述可能なため、メンテナンスはしやすい。
デメリット
- ドキュメントが少ない。
- 単純、もしくは少し複雑な位であれば問題ないが、それを越えると手に負えなくなる。また、JPAの仕様の範囲で対応できなくなった場合、プロバイダ固有の機能を使う必要がでてくる。たとえば、独自のオブジェクトをDBの一カラムにマッピングすることはJPAでは対応できない。Hinernate固有の機能を用いれば可能。
- 上記に関連して、JPAというよりもJPAに対応したプロバイダ自体に精通している必要がある。
- LAZY FATCHとEAGER FETCHを動的に切り替えられない。Web系の場合、EntityをJSPにバインドしたいが、その場合トランザクションをJSPのレイヤでコントロールした上でLAZYとするか、JSPにバインドする可能性のあるEntityはすべてEAGERにするかいずれかとなる。
- テーブル間のリレーションは基本的にFKを張ることが前提となるため、リレーション先の主キーが落ちる可能性がある場合はリレーションが張れない。手動で取得し、オブジェクトに参照をつめる必要がある。
ひがやすおさんのBlogでもJPAについて言及されていますが、SQLの部分を除き大体同意できます。やはり本当に現場で使えるかどうかはうたい文句ではなく、ひがさんの言うように実際に使ってみるしかないと感じます。
今回のプロジェクトでJPAの利用を主張した人達は、JPAでの実戦経験はなかったようです。一応検証は行っていたようですが、実際に発生する問題・課題は事前に想定することが難しいものです。それが簡単なのであれば、仕様で対応されているはずですから。
表面的なことだけでなく、実際に使ったことのある経験者が参加するか余裕の有るプロジェクトではない限り、JPAに限らず新しいフレームワークの類は使うべきではないと実感しました。
JPA(Java Persistence API)は美味しいか? More ログイン