最後にOpenJPAで日本語が通るか試してみた

NetBeansのライブラリへ登録して、EJB-jar、warともに組み込む。ライブラリサイズはHibernate EntityManagerよりはるかに小さい。

そしてpersistence.xmlJPAベンダを切り替え。これはNetBeans6.1だとドロップダウンリストを選択するだけなので非常に楽チン。


・・・結果成功!日本語の扱いに問題があるのはTopLink & EclipseLinkだけということになった。


ログが一切書き出されていないようなのでそれを表示。
persistence.xmlのpropertiesに追加する。

<property name="openjpa.Log" value="DefaultLevel=INFO,SQL=TRACE"/>

これでSQLが表示される。

生成されるSQLを見る限りHibernate EntityManagerのようにひどいSQLを発行することはないようだ。よしよし。

あとは悲観的ロックだが、Hibernate EntityManagerはやり方はわからなかったが、OpenJPAはちょっと調べればすぐにわかった。

まずpersistence.xmlのpropertiesに次の一文を追加する。

<property name="openjpa.LockManager" value="pessimistic"/> 

そして、発行時のヒントとして

setHint("openjpa.FetchPlan.ReadLockMode",LockModeType.READ)

を追加する。


生成されたSQLを見る限り「for update」が追加されている。おそらくこれで動いてると思う。


ちょっと触ってみた感じだと一番まともに動いてるのがOpenJPAという結論になった。GlassFishとの相性が悪いTopLinkから差し替えていい気がする。

というか、TopLink(とEclipseLink)はGlassFishコンポーネントのひとつなのに相性が悪いというのがおわっとる。

まとめるとこんな感じ

JPAベンダ 発行されるSQL ライブラリサイズ 悲観的ロック 日本語 LAZY
TopLink Essentials & EclipseLink(NetBeansGlassFishのデフォルト) ×
Hibernate EntityManager × × ×
OpenJPA


OpenJPAは日本語の資料ほぼゼロというあたりがアレだが、Apacheプロジェクトの中ではかなりまともな部類に入るような気がする。

[追記]
Hibernate EntityManagerはRemoteで動作がおかしくなるようでした。