Kev*_*vin 22 java hibernate nullpointerexception criteria-api jpa-2.0
我想将JPA2 Criteria API与元模型对象一起使用,这看起来很简单:
...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;
Run Code Online (Sandbox Code Playgroud)
但是这个Root.get总是抛出一个NullPointerException
.JPAAlbum_.theme
是由Hibernate自动生成的,看起来像
public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;
Run Code Online (Sandbox Code Playgroud)
但它显然从未填充过.
我错过了框架初始化的一个步骤吗?
编辑:这是我在崩溃时如何使用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())) ;
Run Code Online (Sandbox Code Playgroud)
(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)
Run Code Online (Sandbox Code Playgroud)
编辑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()) ;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,Hibernate知道我的元模型,但是编写了属性名称
log.warn("_+_"+JPAPhoto_.id+"_+_") ;
Run Code Online (Sandbox Code Playgroud)
仍然绝望地空着......
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)
Run Code Online (Sandbox Code Playgroud)
一个更简单的项目,请点击这里/压缩包.它只包含我的实体和他们的元模型,加上一个JUnit测试(foo与metamodel崩溃,bar可以使用通常的Query.
编辑5:
您应该能够通过下载tarball来重现问题,从而构建项目:
ant compile
or
ant dist
Run Code Online (Sandbox Code Playgroud)
并启动JUnit测试 net.wazari.dao.test.TestMetaModel
CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore net.wazari.dao.test.TestMetaModel
Run Code Online (Sandbox Code Playgroud)
(编辑runTest.sh
将CLASSPATH指向JUnit4-5 jar的正确位置)
我使用的所有hibernate依赖项都应该包含在归档中.
Vít*_*uza 11
我在GlassFish上使用EclipseLink创建了一个Java EE 6应用程序,并创建了一些@StaticMetamodel类,一切正常.当我在JBoss 7上切换到Hibernate 4时,我也开始使用这些NPE.我开始调查,我找到了这个页面:
http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/metamodel.html
它引用了JPA 2规范,第6.2.1.1节,它定义了如何构建静态元模型类.例如,我通过阅读规范发现"将在本规范的未来版本中提供不同包的选项".我在不同的包中使用了元模型类,它在EclipseLink上运行良好,但它是一个额外的功能,因为当前标准表明如下:
一旦我遵循规范中的所有规则(上面只是一个摘要,请参阅完整版本规范的第6.2.1.1节),我就停止了例外.
顺便说一下,你可以在这里下载规范:http://jcp.org/en/jsr/detail?id = 317(点击"下载页面"获取最终版本,选择下载规范进行评估,接受协议并下载文件"SR-000317 2.0 Specification" - persistence-2_0-final-spec.pdf).
我无法重现这个问题.我使用了你的一些实体(简化版本JPAAlbum
,JPATheme
并且JPATagTheme
没有任何接口),生成了元模型类,以及下面的基本测试方法(在事务中运行)只传递:
@Test
public void foo() {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<JPAAlbum> query = builder.createQuery(JPAAlbum.class);
Root<JPAAlbum> album = query.from(JPAAlbum.class);
Assert.assertNotNull(album.get(JPAAlbum_.theme)); // no problem here
query.where(builder.equal(album.get(JPAAlbum_.theme).get(JPATheme_.id), 1L));
List<JPAAlbum> results = em.createQuery(query).getResultList();
}
Run Code Online (Sandbox Code Playgroud)
FWIW,这是生成的SQL:
select
jpaalbum0_.ID as ID32_,
jpaalbum0_.AlbumDate as AlbumDate32_,
jpaalbum0_.Description as Descript3_32_,
jpaalbum0_.Nom as Nom32_,
jpaalbum0_.Picture as Picture32_,
jpaalbum0_.Theme as Theme32_
from
Album jpaalbum0_
where
jpaalbum0_.Theme=1
Run Code Online (Sandbox Code Playgroud)
在任何容器外部使用Hibernate EntityManager 3.5.6-Final,Hibernate JPAModelGen 1.1.0.Final进行测试.
我的建议是首先尝试在JUnit测试上下文中重现(如果可重现)问题.
PS:作为旁注,我不会在VCS中存储生成的类.
更新:persistence.xml
您可以在测试环境中使用以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="MyPu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.stackoverflow.q3854687.JPAAlbum</class>
<class>com.stackoverflow.q3854687.JPATheme</class>
<class>com.stackoverflow.q3854687.JPATagTheme</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- Common properties -->
<property name="javax.persistence.jdbc.driver" value="${jdbc.driver}" />
<property name="javax.persistence.jdbc.url" value="${jdbc.url}" />
<property name="javax.persistence.jdbc.user" value="${jdbc.user}" />
<property name="javax.persistence.jdbc.password" value="${jdbc.password}" />
<!-- Hibernate specific properties -->
<property name="hibernate.dialect" value="${jdbc.dialect}" />
<!--
<property name="hibernate.show_sql" value="true"/>
-->
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17922 次 |
最近记录: |