8

从今天(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>

Glassfish 嵌入式 EJBContainer 在工作时会输出以下内容:

Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINE: Got com.sun.enterprise.deployment.node.PersistenceUnitNode@2026c088
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINER: With attribute name
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINER: With value cx
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor  method  setName with  cx
...snip...
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINE: Got com.sun.enterprise.deployment.node.PersistenceUnitNode@1648ff68
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINER: With attribute name
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINER: With value ngp
Nov 12, 2010 1:24:05 PM com.sun.logging.LogDomains$1 log
FINE: in class com.sun.enterprise.deployment.PersistenceUnitDescriptor  method  setName with  ngp

故障排除食谱,有人吗?

4

3 回答 3

7

这是怪异行为和飞行员错误的结合。

一是飞行员失误。

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

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

但当然它不是 EJB。

然而,神秘的是,其中有一个@PersistenceContext注释,还有一个EntityManager未使用的 。持久性上下文有一个属性——你猜对了—— unitName="cx"

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

无论如何,一旦我删除了这个虚假@PersistenceContext的注释,一切正常。

于 2010-11-12T21:29:52.107 回答
5

如果您错误地放置了 @PersistenceContext(name="cx") 而不是 @PersistenceContext(unitName="cx") ,那么在其他一切正常工作时都会出现相同的错误。

于 2014-07-23T16:06:10.347 回答
1

我遇到了同样的问题。错误出现在我的 unitName 之一的名称中

unitName="PUname error in one of my classes"
于 2018-06-10T14:44:35.407 回答