2010-11-12 43 views
5

從今天開始運行Glassfish 3.1-SNAPSHOT(2010-11-12)。當指定PU時,修復「無法解析持久性單元...」錯誤

我正在使用嵌入式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 [email protected] 
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 [email protected] 
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 

疑難解答食譜,任何人?

+0

我應該提到我正在使用JTA - 容器管理事務 - 在兩個PU中。我發現XA在這裏是一個要求。我的測試數據源不符合XA的事實是否會導致此錯誤? – 2010-11-12 18:13:29

+0

已更新數據源以使用XA;沒有效果。 – 2010-11-12 18:26:32

+0

數據源是否是XA應該無關緊要,至少不是現在(如果您決定同時使用兩個EM,可能會晚一些,但這是另一回事)。它只適用於一個PU嗎? – 2010-11-12 18:57:57

回答

5

這是一個奇怪的行爲和飛行員錯誤的組合。

首先,試點錯誤。

我在看的特定的JUnit測試用例是一個同事,它的命名規則是遵循我們的內部命名約定,它被命名爲EJB本身。這可能是我的同事的一個剪切和粘貼錯誤。

我提到,因爲每當我打開文件時,我都盯着它看,好像它本身就是一個EJB。

但它當然不是一個EJB。

然而,神祕的是,這裏有一個@PersistenceContext註釋和一個未使用的EntityManager。持久化上下文有一個屬性 - 你猜對了 - unitName="cx"

所以奇怪的行爲是在運行這個測試用例的舊EJB容器之間的某個地方,現在,EJB容器開始將這個非EJB,非特殊類作爲@PersistenceContext注入的有效目標。也許這個測試用例被視爲一個託管bean,但我的印象是非CDI環境中的託管bean必須被註釋爲這樣。

無論如何,一旦我刪除這個虛假@PersistenceContext註釋,一切工作正常。

+0

這解釋了很大一部分問題。但是,GF 3.0.1和GF 3.1之間的變化確實很奇怪(並且可能存在某處的錯誤)。你的檔案是否啓用CDI(它是否有beans.xml)? – 2010-11-13 07:25:22

+0

不,它故意沒有啓用CDI,因爲Glassfish在過去曾經與CDI有過各種可怕的問題。 – 2010-11-16 21:21:22

4

如果您錯誤地將@PersistenceContext(name =「cx」)而不是@PersistenceContext(unitName =「cx」),您會發現與其他工作相同的錯誤。

+1

歡迎來到SO。爲了將來的參考,你應該考慮給出更詳細和完整的答案,否則你可能會downvoted/flaggged。 :)快樂的編碼。 – 2014-07-23 16:13:49

+1

當然,答案有點短,但它只是解決我的問題。 – 2015-10-13 14:55:44

相關問題