我是Java EE的新手,在使用命名查询时遇到了一些麻烦。我们使用JBoss 6和Hibernate 3.6(JPA 2.0)。实体是通过注释配置的,而不是在persistence.xml中配置的:
@Entity
@NamedQueries({
@NamedQuery(name = "Node.findRootNodes", query = "SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0"),
...
})
public class Node implements Serializable { ... }
当部署包含实体的jar时,JBoss-log告诉我们,命名查询是绑定的:
[org.hibernate.cfg.annotations.QueryBinder] Binding Named query: Node.findRootNodes => SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0
不幸的是,在使用命名查询时,我们总是遇到IllegalArgumentException:
[com.NodeTest] null: javax.ejb.EJBException: java.lang.IllegalArgumentException: Named query not found: Node.findRootNodes
使用named-query的无状态bean与Node-Entity位于同一个jar中。调用无状态bean的应用程序部署在不同的war文件中。
有人知道我做错了什么吗?谢谢你的回答。
这是persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="testPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/main</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
</properties>
</persistence-unit>
</persistence>
答案 0 :(得分:4)
要检查的内容:
EntityManager
是由EntityManagerFactory
代表正确的持久性单元Entity
是否实际由给定的持久性单元处理。尝试加载具有给定ID的实体。 更新1:似乎您的实体未被持久性单元加载。检查persistence.xml
<exclude-unlisted-classes>
并将其删除。 Hibernate应支持自动检测实体,但只需验证 - 在persistence.xml
更新2 :确保您的@Entity
注释实际为javax.persistence.Entity
,而不是org.hibernate....
答案 1 :(得分:1)
我可以通过移动包含应用程序的persistence.xml
内的war
而不是包含实体和bean的jar
来解决此问题。另外,我必须将以下行添加到persistence.xml
:
<jar-file>Entities.jar</jar-file>
但现在我必须将persistence.xml放在使用我的Entities.jar
。