Не заполнены статические атрибуты метамодели JPA / Hibernate - NullPointerException

Я хотел бы использовать API критериев JPA2 с объектами метамодели, что кажется довольно простым:

...
Root albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;

но этот Root.get всегда выдает исключение NullPointerException . JPAAlbum_.theme был автоматически сгенерирован Hibernate и выглядит как

public static volatile SingularAttribute theme;

, но, очевидно, никогда не заполнялся.

Я пропустил этап инициализации фреймворка?

EDIT: здесь это фрагмент того, как я использую JPA и метамодель при сбое:

    CriteriaBuilder cb = em.getCriteriaBuilder();

    CriteriaQuery cq = cb.createQuery(JPAAlbum.class) ;
    Root albm = cq.from(JPAAlbum.class);
    cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id),
                        session.getTheme().getId())) ;

( JPAAlbum_ - это класс, поэтому я просто импортирую раньше) и связанную трассировку стека:

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 и его класс метамодели .

Что еще я могу сказать о своей конфигурации ...

  • Я использую Hibernat 3.5.6-Final (согласно META-INF /MANIFEST.MF),

  • развернуть на Glassfish 3.0.1

  • из Netbeans 6.9.1 ;

  • , а приложение использует EJB 3.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)

Все используемые мной зависимости гибернации должны быть включены в архив.

22
задан Kevin 13 November 2010 в 20:56
поделиться