【问题标题】:JBoss/Hibernate IllegalArgumentException: Named query not FoundJBoss/Hibernate IllegalArgumentException:未找到命名查询
【发布时间】:2011-09-11 19:46:32
【问题描述】:

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

【问题讨论】:

    标签: hibernate jboss6.x named-query


    【解决方案1】:

    检查内容:

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

    更新 1: 似乎您的实体没有被持久化单元加载。检查您的persistence.xml 是否有&lt;exclude-unlisted-classes&gt; 并将其删除。 Hibernate 应该支持自动检测实体,但只是为了验证 - 在 persistence.xml 中列出您的类

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

    【讨论】:

    • EntityManager 使用@PersistencUnit 注入。 persistence.xml 中只定义了一个持久性单元。加载具有给定 id 的实体失败并返回 IllegalArgumentException: Unknown entity。嗯……所以实体实际上并没有被持久化单元处理?
    • 是的。你需要使用@PersistenceContext btw 注入它。其余的 - 检查更新。
    • 抱歉,我当然注入了@PersistenceContext,我尝试了您的建议,在persistence.xml 中列出实体类,但仍然是Unknown entity。顺便提一句。我用我的 persistence.xml 更新了帖子
    • 好吧,那么你没有得到正确的持久化上下文......但我不知道为什么。
    • 在调用 EntityManager 从部署在不同 war 文件中的应用程序 (Servlet) 注入的无状态 bean 时是否会出现问题? persistence.xml 被放置在包含无状态 bean 和实体的 jar 中。
    【解决方案2】:

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

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

    但现在我必须将persistence.xml 放在任何使用我的Entities.jar 的应用程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多