JBoss / Hibernate IllegalArgumentException:未找到命名查询

时间:2011-06-09 15:25:00

标签: hibernate jboss6.x named-query

我是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>

2 个答案:

答案 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

的任何应用程序中