JPA 2.0のデータベース接続情報
JPA2といえば目玉はCriteria。
ですが、Criteriaが開発当初から大幅に変わって、人間が読みやすいというよりはコンピュータにわかりやすいという方法をとったのでちょっとどうかなぁと思っていたのだが、そもそもSelect文をそのまま当てはめるならCriteriaである意味が大きくないのでこれもありかなと思い、さわりはじめたところ、実はCriteria以外の強化がかなり重要だというのがわかってきた。
というわけでJPA 2.0の新機能について書いていきたいと思う。まずはかるめに接続情報から。
JPAはアプリケーションサーバーから注入もらう以外にスタンドアロンで使用することが出来るのだが、そうすると必要になるのがユーザー名やパスワード等の接続情報。
この情報は「persistence.xml」に記述するわけだが、JPA 1.0の時点では信じられないことに統一されていなかった。データベースごとに必要となる接続情報が違うから無理だったのかもと一瞬思ったが、それならばその差分だけ特殊なプロパティを使えばいいのであって一般的なものを統一しない意味がない。
おそらくもともとEJB 3の一機能だったんで、スタンドアロンの使い方はあまり考慮されていないというのが真実だろう。データベースの接続情報はアプリケーション側に持つべきものではないというのはエンタープライズJavaを開発してきた人にとっては常識だからだ。
ではユーザー名、パスワード等の設定をJPAプロバイダによっどう違っていたのかを記述してみる。
Toplink Essentials
JPA1.0のRI。もともとOralceから寄贈されたもの。EclipseLinkの元と思ってよい。積極的なキャッシングするのでクライアント用途というよりサーバーサイド向き。設定によって大きく動きや速度が変わる。
<property name="toplink.jdbc.user" value="hoge"/> <property name="toplink.jdbc.password" value="hoge"/> <property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/Employee"/> <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
Hibernate EntityManager
最もよく使われているO/Rマッパ。基本JPAで動かしつつ、独自のAPIで足りない分を補うのが流行の使い方らしい。次期バージョンではJPA2へはデフォで対応する予定ということだが。実装が一番独特で、動きはクライアント向き。
<property name="hibernate.connection.username" value="hoge"/> <property name="hibernate.connection.password" value="hoge"/> <property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/Employee"/> <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver" />
EclipseLink 1.x
2.0のRI。1.2まではJPA 1準拠。基本的にTopLinkと同じ動き。
<property name="eclipselink.jdbc.user" value="hoge"/> <property name="eclipselink.jdbc.password" value="hoge"/> <property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/Employee"/> <property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
OpenJPA
個人的に発行するSQLとかキャッシングがデフォで一番扱いやすいと思う。
<property name="openjpa.ConnectionUserName" value="hoge" /> <property name="openjpa.ConnectionPassword" value="hoge" /> <property name="openjpa.ConnectionURL" value="jdbc:derby://localhost:1527/Employee"/> <property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.ClientDriver" />
とまぁ必要としているパラメータは同じでありながら見事にばらばらだ。
JPA 2.0
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/Employee"/> <property name="javax.persistence.jdbc.password" value="hoge"/> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.user" value="hoge"/>
やっと統一された。
そのほかキャッシュ方式やバリデーション等の設定も統一されている模様。