Jpa “固定”;无法解析持久性单元…”;指定PU时出错,已找到

Jpa “固定”;无法解析持久性单元…”;指定PU时出错,已找到,jpa,glassfish,jpa-2.0,ejb-3.1,Jpa,Glassfish,Jpa 2.0,Ejb 3.1,从今天起(2010-11-12),我正在运行Glassfish 3.1-SNAPSHOT 我正在使用嵌入式EJBContainer 在EJBContainer报告的类路径上,我有一个META-INF/persistence.xml。该文件定义了两个持久性单元:一个称为“ngp”,另一个称为“cx” 调试输出显示Glassfish JPA部署程序找到了它,并识别cx PU和ngp PU EJBContainer爆炸出以下非常常见的JPA错误: java.lang.RuntimeException:

从今天起(2010-11-12),我正在运行Glassfish 3.1-SNAPSHOT

我正在使用嵌入式EJBContainer

在EJBContainer报告的类路径上,我有一个META-INF/persistence.xml。该文件定义了两个持久性单元:一个称为“ngp”,另一个称为“cx”

调试输出显示Glassfish JPA部署程序找到了它,并识别cx PU和ngp PU

EJBContainer爆炸出以下非常常见的JPA错误:

java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [cx] in the scope of the module called [/Users/ljnelson/Projects/foo/target/test-classes/]. Please verify your application.
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:693)
at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:910)
at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:140)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:869)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:193)
at org.glassfish.kernel.embedded.EmbeddedDeployerImpl.deploy(EmbeddedDeployerImpl.java:142)
at org.glassfish.ejb.embedded.EJBContainerImpl.deploy(EJBContainerImpl.java:135)
at org.glassfish.ejb.embedded.EJBContainerProviderImpl.createEJBContainer(EJBContainerProviderImpl.java:132)
at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:127)
我再次强调,部署日志显示,至少部署人员遇到了这两个持久性单元

想要使用“cx”PU的类包含通常的样板文件:

@PersistenceContext(unitName="cx")
private EntityManager em;
persistence.xml位于(通常的Maven位置)
target/test classes/META-INF
中,如下所示:

<?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="cx" transaction-type="JTA">
        <jta-data-source>java:global/jdbc/H2Test</jta-data-source>
        <!-- snip -->
    </persistence-unit>

    <persistence-unit name="ngp" transaction-type="JTA">
        <jta-data-source>java:global/jdbc/H2Test</jta-data-source>
        <!-- snip -->
    </persistence-unit>

</persistence>

有人给菜谱找麻烦吗

这是一个奇怪的行为和飞行员错误的组合

首先,飞行员失误

我正在查看的特定JUnit测试用例是一位同事的,按照我们的内部命名约定,它被命名为EJB本身。这可能是我同事的剪切粘贴错误

我提到这一点是因为每次打开文件时,我都盯着它看,好像它本身就是一个EJB

但它当然不是EJB

然而,奇怪的是,其中有一个
@PersistenceContext
注释和一个未使用的
EntityManager
。持久性上下文有一个属性——您猜到了——
unitName=“cx”

所以奇怪的行为是,在旧的EJB容器(它可以很好地运行这个测试用例)和现在的EJB容器之间,EJB容器开始将这个非EJB、非特殊类作为
@PersistenceContext
注入的有效目标。也许这个测试用例被视为托管bean,但我的印象是非CDI环境中的托管bean必须被注释为托管bean


不管怎样,一旦我删除了这个虚假的
@PersistenceContext
注释,一切都很好。

如果你错误地将@PersistenceContext(name=“cx”)替换为@PersistenceContext(unitName=“cx”),那么其他一切都会出现同样的错误。

我面临同样的问题。错误出现在我的一个unitName的名称中

unitName="PUname error in one of my classes"

我应该提到的是,我在两种PUs中都使用了JTA——容器管理事务。我突然想到XA将是这里的一个需求。我的测试数据源不符合XA这一事实会导致此错误吗?更新数据源以使用XA;没有影响。数据源是否是XA不重要,至少现在不重要(如果您决定同时使用这两个EM,可能会晚些时候,但这是另一回事)。它只与一个PU一起工作吗?是的。很难说是哪一部分造成了这个错误。在类路径中,我有一个抽象DAO,带有一个引用“ngp”持久化单元的em,因此该单元需要在那里进行注入。但是测试用例中没有任何东西使用该实体管理器,并且测试中的bean不从AbstractDAO扩展。这个设置确实适用于一个嵌入Glassfish的古老版本--3.0.1-b02(如果内存可用的话)。我想,是时候浪费下午剩下的时间编写一个测试用例并归档一个Glassfish bug了!这就解释了问题的很大一部分。然而,GF 3.0.1和GF 3.1之间的变化确实很奇怪(可能在某个地方有一个bug)。您的归档文件是否启用了CDI(它是否有beans.xml)?不,它故意不启用CDI,因为Glassfish过去在CDI方面遇到过各种可怕的问题。欢迎访问。为了将来的参考,你应该考虑给出一个更详细和完整的答案,否则你可能会被否决。快乐的编码。当然,答案有点短,但它只是我问题的解决方案。
unitName="PUname error in one of my classes"