2007-06-11

OpenJPA がエンティティクラスを認識しない問題

JPAでは、JPQLという SQLによく似た問い合わせ言語を使ってデータベースを利用できる。SQLとの違いは、SQLが「行」や「列」を扱うものであるのに対して(当然)、JPQLは行や列の代わりに「オブジェクト」「プロパティ」を扱うようになっていることだ。

下記の例では、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) {
// ここにはこないで・・・
}
}

ラベル:

0 件のコメント:

コメントを投稿

<< ホーム