NamedQuery:外部化实体后的 IllegalArgumentException(未找到查询)

Posted

技术标签:

【中文标题】NamedQuery:外部化实体后的 IllegalArgumentException(未找到查询)【英文标题】:NamedQuery: IllegalArgumentException (Query not found) after externalizing entities 【发布时间】:2011-09-04 11:01:36 【问题描述】:

我已经成功地将javax.persistence.NamedQuery 与 JPA2 结合使用。命名查询定义在实体类文件的顶部,用于无状态 EJB(实体外观)。

现在我必须将实体类文件提取到一个单独的 Jar 文件中(这样我们就可以从 Google Web Toolkit 项目中使用它们)。显然我仍然包含 jar,但现在外观 bean 不再找到查询:

java.lang.IllegalArgumentException: NamedQuery of name: Store.findByExternalId not found.
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:576)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1004)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:533)
    at com.skalio.bonusapp.server.StoreFacade.getByExternalId(StoreFacade.java:43)
    ...

这里有什么问题?我不能在外部 Jar 中定义 NamedQueries 吗?

我刚找到这个link,建议把NamedQueries 放在XML 文件中,而不是作为实体文件中的注解。这可能是解决我的问题的一个想法,但没有回答我的问题... ;)

【问题讨论】:

【参考方案1】:

解决办法是在persistence.xml文件中指定包含JPA Entities的类:

<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="bonusAppServerPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/someDB</jta-data-source>
        <class>com.skalio.bonusapp.core.Store</class>
    </persistence-unit>
</persistence>

背景是 JPA 需要被告知在哪里扫描注释。另一种选择是使用&lt;jar-file&gt;&lt;/jar-file&gt; 节点。

【讨论】:

您可以使用完整的包扫描,而不是像下面那样给出每个类名&lt;property name="hibernate.archive.autodetection" value="class, hbm" /&gt;

以上是关于NamedQuery:外部化实体后的 IllegalArgumentException(未找到查询)的主要内容,如果未能解决你的问题,请参考以下文章

从 JPA 实体的接口中检索 @NamedQuery

NamedQuery 返回具有空字段的实体

我应该使用 @NamedQuery 注释还是 addNamedQuery 方法?

JPA:如何将@NamedStoredProcedureQuery 与@NamedQuery 结合起来执行周边搜索?

JPA NamedQuery 与聚合函数和分组依据一起使用

javax.persistence NamedQuery 未按预期工作