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.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage