Lai*_*son 7 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: 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)
Run Code Online (Sandbox Code Playgroud)
我再次强调,部署日志显示至少部署者遇到两个持久性单元.
想要使用"cx"PU的类包含通常的样板:
@PersistenceContext(unitName="cx")
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
食谱疑难解答,任何人?
这是奇怪的行为和飞行员错误的组合.
首先是飞行员错误.
我正在研究的特定JUnit测试用例是一个同事,并且根据我们的内部命名约定,它被命名为EJB本身.这可能是我同事的剪切和粘贴错误.
我提到这一点,因为每次打开文件时我都盯着它,好像它本身就是一个EJB.
但当然它不是EJB.
然而,神秘的是,那里有一个@PersistenceContext注释,而且EntityManager没有使用.持久化上下文具有 - 您猜对了 - 的属性unitName="cx".
所以奇怪的行为就是旧EJB容器之间的某个地方,它运行了这个测试用例,现在,EJB容器开始将这个非EJB非特殊类视为有效的@PersistenceContext注入目标.也许这个测试用例被视为托管bean,但我的印象是非CDI环境中的托管bean必须这样注释.
无论如何,一旦我删除了这个虚假的@PersistenceContext注释,一切都运行良好.
如果错误地将 @PersistenceContext(name="cx") 而不是 @PersistenceContext(unitName="cx") ,则其他所有工作都会出现相同的错误。
| 归档时间: |
|
| 查看次数: |
24220 次 |
| 最近记录: |