一尘不染

未填充JPA /休眠静态元模型属性— NullPointerException

hibernate

我想将JPA2 Criteria API与元模型对象一起使用,这似乎很简单:

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

但是这个Root.get总是抛出一个NullPointerExceptionJPAAlbum_.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+"_+_") ;

仍然拼命空着…

编辑3
:这是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崩溃,通常的Query都可以吧。

编辑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的正确位置)

我使用的所有hibernate依赖关系都应包含在存档中。


阅读 260

收藏
2020-06-20

共1个答案

一尘不染

我有同样的问题,可以通过将Modeland Model_类放入同一包中来解决。

2020-06-20