最後にOpenJPAで日本語が通るか試してみた
NetBeansのライブラリへ登録して、EJB-jar、warともに組み込む。ライブラリサイズはHibernate EntityManagerよりはるかに小さい。
そしてpersistence.xmlのJPAベンダを切り替え。これは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(NetBeansやGlassFishのデフォルト) | ○ | ○ | ○ | × | ○ |
Hibernate EntityManager | × | × | ? | × | △ |
OpenJPA | ○ | △ | ○ | ○ | ○ |
OpenJPAは日本語の資料ほぼゼロというあたりがアレだが、Apacheプロジェクトの中ではかなりまともな部類に入るような気がする。
[追記]
Hibernate EntityManagerはRemoteで動作がおかしくなるようでした。