1

我是 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 日志告诉我们,命名查询已绑定:

[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

使用命名查询的无状态 bean 与节点实体在同一个 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>
4

2 回答 2

4

要检查的内容:

  • 如果您EntityManager是由EntityManagerFactory代表适当的持久性单元创建的
  • Entity是否实际由给定的持久性单元处理。尝试加载具有给定 ID 的实体。
  • 是否找到其他实体上的其他命名查询

更新 1:似乎您的实体没有被持久性单元加载。检查persistence.xml<exclude-unlisted-classes>删除它。Hibernate 应该支持自动检测实体,但只是为了验证 - 列出你的类persistence.xml

更新 2:确保您的@Entity注释实际上是javax.persistence.Entity,而不是org.hibernate....

于 2011-06-09T15:28:47.490 回答
1

我可以通过移动包含应用程序的persistence.xml内部而不是包含实体和 bean的内部来解决这个问题。此外,我必须将以下行添加到我的:warjarpersistence.xml

<jar-file>Entities.jar</jar-file>

但是现在我必须将 persistence.xml 放在任何使用我的Entities.jar.

于 2011-06-10T12:04:37.223 回答