メタモデルオブジェクトでJPA2CriteriaAPIを使用したいのですが、これは非常に簡単なようです。
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
ただし、このRoot.getは常に。をスローしNullPointerException
ます。JPAAlbum_.theme
Hibernateによって自動的に生成され、次のようになります
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
しかし、それは明らかに決して移入されていません。
フレームワークの初期化のステップがありませんか?
編集:これは、クラッシュしたときにJPAとメタモデルを使用する方法のスニペットです:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<JPAAlbum> cq = cb.createQuery(JPAAlbum.class) ;
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id),
session.getTheme().getId())) ;
(JPAAlbum_
はクラスなので、直前import
に)および関連するスタックトレース:
Caused by: java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.jpa.WebAlbumsDAOBean.getRestrictionToAlbumsAllowed(WebAlbumsDAOBean.java:55)
編集2:
JBoss EntityManagerガイドでは、次のことがわかります。
Hibernate EntityManagerFactoryが構築されると、[JPA 2仕様、セクション6.2で概説されているように、既知の管理対象型ごとに正規のメタモデルクラスが検索され、見つかった場合は適切なメタモデル情報が挿入されます。 .2、200ページ]
で確認することもできます
for (ManagedType o : em.getMetamodel().getManagedTypes()) {
log.warn("___") ;
for (Object p : o.getAttributes()) {
log.warn(((Attribute)p).getName()) ;
}
}
Hibernateが私のメタモデルを認識していること、属性名は書かれていますが、
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
必死に空のまま...
EDIT3:これがJPAAlbumエンティティとそのメタモデルクラスです。
自分の構成について他に何がわかりますか...
私はHibernat3.5.6 -Final(META-INF / MANIFEST.MFによる)を使用しています。
Glassfish3.0.1にデプロイする
Netbeans6.9.1から;
アプリケーションはEJB3.1に依存しています。
お役に立てば幸いです。
編集4:
残念ながら、JUnitテストでは同じ例外が発生します。
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)
はるかに単純なプロジェクトがここ/ tarballで利用可能です。エンティティとそのメタモデル、およびJUnitテストのみが含まれています(fooはメタモデルでクラッシュし、barは通常のクエリで問題ありません。
編集5:
tarballをダウンロードし、プロジェクトをビルドすることで、問題を再現できるはずです。
ant compile
or
ant dist
JUnitテストを開始しますnet.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(runTest.sh
CLASSPATHがJUnit4-5 jarの正しい場所を指すように編集します)
私が使用するすべての休止状態の依存関係は、アーカイブに含まれている必要があります。