Glassfish上でのJPAの日本語問題まとめ
GlassfishとNetBeansでJPAがうまく扱えない問題のまとめ。いろいろとやっていたら再現するパターンが結構複雑だった。
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 : GlassfishやNetBeansに標準搭載。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を使うとNetBeansのJUnit自動生成昨日は使えない。
開発時と運用時でJPAベンダをかえるということはしたくないしなぁ。Hibernaate EntityManagerで悲観的ロックの方法がわかればまだいいんだけど。Hibernateのsessionをとりだすしかないのかな。