NamedQuery: 在将实体外部化后出现非法参数异常(找不到查询)。

14

我成功地使用了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吗?
我刚刚发现了这个链接,建议将NamedQueries放在XML文件中,而不是作为实体文件中的注释。这可能是解决我的问题的一个想法,但并没有回答我的问题... ;)
1个回答

25

解决方案是在persistence.xml文件中指定包含JPA实体的类:

<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需要告诉它在哪里扫描注解。另一种选择是使用<jar-file></jar-file>节点。


你可以使用完整的包扫描,而不是像下面这样逐个类名地指定: <property name="hibernate.archive.autodetection" value="class, hbm" /> - Jess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接