OpenJPA がエンティティクラスを認識しない問題
JPAでは、JPQLという SQLによく似た問い合わせ言語を使ってデータベースを利用できる。SQLとの違いは、SQLが「行」や「列」を扱うものであるのに対して(当然)、JPQLは行や列の代わりに「オブジェクト」「プロパティ」を扱うようになっていることだ。
下記の例では、hogeプロパティが honyaと等価な MyEntityクラスオブジェクトのリストが返ってくる。(むろん、実際にはRDBのテーブル・行・列が検索される)
ところが、このコードでOpenJPAが下記のような例外を投げてくるという現象が発生した。
org.apache.openjpa.persistence.ArgumentException: Could not locate metadata for the class using alias "MyEntity". Registered alias mappings: "{MyEntity=null}"
要するに MyEntityなんてクラスは知らないよと。
EntityManager#find()を使った場合などはこのエラーが出なかったのだが・・・
どうやら、OpenJPAでは createQuery(など)が行われる前に対象のエンティティクラスが最低いちどは VMにロードされていなくてはいけないらしい。(利用のしかたにもよるのかも)
というわけで、格好悪いけど JPAを利用する Beanに下記のような staticコンストラクタを書き足した。余計な依存性は発生しないし、ひとまずこれで良いとする。
下記の例では、hogeプロパティが honyaと等価な MyEntityクラスオブジェクトのリストが返ってくる。(むろん、実際にはRDBのテーブル・行・列が検索される)
Collection col =
entityManager.createQuery(
"select m from MyEntity m where m.hoge=?1")
.setParameter(1, honya)
.getResultList();
ところが、このコードでOpenJPAが下記のような例外を投げてくるという現象が発生した。
org.apache.openjpa.persistence.ArgumentException: Could not locate metadata for the class using alias "MyEntity". Registered alias mappings: "{MyEntity=null}"
要するに MyEntityなんてクラスは知らないよと。
EntityManager#find()を使った場合などはこのエラーが出なかったのだが・・・
どうやら、OpenJPAでは createQuery(など)が行われる前に対象のエンティティクラスが最低いちどは VMにロードされていなくてはいけないらしい。(利用のしかたにもよるのかも)
というわけで、格好悪いけど JPAを利用する Beanに下記のような staticコンストラクタを書き足した。余計な依存性は発生しないし、ひとまずこれで良いとする。
static {
try {
MyEntity.class.newInstance();
} catch (Exception e) {
// ここにはこないで・・・
}
}
ラベル: OpenJPA

0 件のコメント:
コメントを投稿
<< ホーム