Glassfish上でのJPAの日本語問題まとめ

GlassfishNetBeansJPAがうまく扱えない問題のまとめ。いろいろとやっていたら再現するパターンが結構複雑だった。

LocalインターフェースのJPAはすべての組み合わせで通りますので、すべてRemoteインターフェースでのテストです。
(当たり前ですがLocalインターフェースだとスコープがearの外に出ませんのでユニットテストができません。)

また、日本語を扱わなければ不具合も発生しません。

JPAベンダ プロジェクト 通常のアプリ JUnit
TopLink Essentials EJBプロジェクト ×
TopLink Essentials WEBプロジェクト × ×
TopLink Essentials エンタープライズクライアントプロジェクト × ×
Hibernate EntityManager EJBプロジェクト ×
Hibernate EntityManager WEBプロジェクト
Hibernate EntityManager エンタープライズクライアントプロジェクト ×
OpenJPA EJBプロジェクト ×
OpenJPA WEBプロジェクト ×
OpenJPA エンタープライズクライアントプロジェクト × ×

Hibernateのエラーは不思議なメッセージが。junitvmwatcherファイルが読み込めないとか意味不明なものが。でも、一番日本語で問題は起きていない模様。

OpenJPAで「×」がついてるのには2種類あって、そのうちひとつがクラスが見つからないというもの。これはクライアント側にもOpenJPAのライブラリを入れることで解決される。もっとも解決された動作がTopLinkと同じなので問題がでるわけなんだけど。

Hibernateが問題ないことを考えると、これってクラスファイルのトランスフォームで問題だしてるってことかなぁ。


一長一短でどれがいいのかわからなくなってきた・・・。

いいところ

  • TopLink Essentials : GlassfishNetBeansに標準搭載。Lazyがちゃんと動く
  • Hibernate EntityManager : 日本語の扱いで一番問題が少ない
  • OpenJPA : 発行されるSQLが一番効率がよさそう。Webプロジェクトならば一応動く。Lazyがちゃんと動く

だめなところ

  • TopLink Essentials : 日本語が一番うまく扱えない
  • Hibernate EntityManager : 発行するSQLがだめなこと、LAZYが普通に動かないこと
  • OpenJPA : 日本語がWebプロジェクト以外で動かない

ちなみにエンタープライズクライアントでの@EJBによるmainクラスへのインジェクトが動かないようだ
NetBeansが自動でstaticなフィールドをつけてインジェクトしてくれるけど、それがどうやらだめ。
Glassfish V1のときは普通に動いていた気がするんだけど。

エンタープライズアプリケーションが通った環境ゼロということで、エンタープライズアプリケーションクライアントの存在意義が不明。元々不明だったけど。

単体テスト等にはWebプロジェクトがよさげ。Hibernate Entitymanager使用時でもなぜかEJBプロジェクトのJUnitは動かないのでやるなら通常のスタンドアロンなプロジェクトで。つまり、JPAを使うとNetBeansJUnit自動生成昨日は使えない。

開発時と運用時でJPAベンダをかえるということはしたくないしなぁ。Hibernaate EntityManagerで悲観的ロックの方法がわかればまだいいんだけど。Hibernateのsessionをとりだすしかないのかな。