JPA / Hibernate Static Metamodel-Attribute nicht ausgefüllt - NullPointerException
Ich möchte die JPA2-Kriterien-API für Metamodellobjekte verwenden, was ziemlich einfach zu sein scheint:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
aber dieses Root.get wirft immer einNullPointerException
. JPAAlbum_.theme
wurde automatisch von Hibernate generiert und sieht aus wie
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
aber es ist offensichtlich nie besiedelt.
Fehlt mir ein Schritt bei der Initialisierung des Frameworks?
BEARBEITEN hier ist ein Ausschnitt davon, wie ich JPA und das Metamodell verwende, wenn es abstürzt:
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_
ist eine Klasse, also habe ich nurimport
before) und der zugehörige Stacktrace:
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)
EDIT 2:
Im JBoss EntityManager-Handbuch kann ich sehen, dass
Wenn die Hibernate EntityManagerFactory erstellt wird, sucht sie nach einer kanonischen Metamodellklasse für jede verwaltete typisierte Klasse und fügt, falls vorhanden, die entsprechenden Metamodellinformationen in sie ein, wie in Abschnitt [JPA 2-Spezifikation, beschrieben 6.2.2, S. 200]
Ich könnte auch mit @ verifizier
for (ManagedType o : em.getMetamodel().getManagedTypes()) {
log.warn("___") ;
for (Object p : o.getAttributes()) {
log.warn(((Attribute)p).getName()) ;
}
}
dass Hibernate mein Metamodell kennt, sind die Attributnamen geschrieben, jedoch
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
bleibt verzweifelt leer ...
EDIT3: Hier ist dasJPAAlbum entity und seinmetamodel class.
Was kann ich sonst noch über meine Konfiguration sagen ...
ch benutze Hibern 3.5.6-Final (gemäß META-INF / MANIFEST.MF),
deploy auf Glassfish 3.0.1
von Netbeans 6.9.1;
und die Anwendung verlässt sich auf EJB 3.1,
Ich hoffe, es wird helfen!
EDIT 4:
Leider führt der JUnit-Test zur gleichen Ausnahme:
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)
Ein viel einfacheres Projekt ist verfügbarHie/ tarball. Es enthält nur meine Entitäten und ihr Metamodell sowie einen JUnit-Test (foo stürzt mit Metamodell ab, Leiste ist in Ordnung mit der üblichen Abfrage.
EDIT 5:
Sie sollten in der Lage sein, das Problem zu reproduzieren, indem Sie die @ -Datei herunterlade tarball, das Projekt erstellen:
ant compile
or
ant dist
und starten Sie den JUnit-Testnet.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
(editrunTest.sh
, um CLASSPATH auf die richtige Position Ihres JUnit4-5-JAR zu verweisen)
Alle Abhängigkeiten im Ruhezustand, die ich verwende, sollten im Archiv enthalten sein.