2010-11-12 9 views
5

Ich betreibe Glassfish 3.1-SNAPSHOT ab heute (2010-11-12).Fehlerbehebung "Konnte nicht eine Persistenzeinheit ... lösen" Fehler, wenn PU angegeben ist, gefunden

Ich verwende den eingebetteten EJBContainer.

Auf dem Klassenpfad, wie vom EJBContainer gemeldet, habe ich eine META-INF/persistence.xml. Diese Datei definiert zwei Persistenzeinheiten: eine namens "ngp" und eine namens "cx".

Debugging-Ausgabe zeigt, dass der Glassfish JPA-Deployer es findet und sowohl die cx PU als auch die ngp PU erkennt.

Die EJBContainer Bomben aus dem folgenden allzu häufigen Fehler 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) 

ich noch einmal betonen, dass die Bereitstellungsprotokolle zeigen, dass die deployer trifft beide Persistenzeinheiten zumindest.

Die Klasse, die die "cx" PU enthält die üblichen Text verwenden möchte:

@PersistenceContext(unitName="cx") 
private EntityManager em; 

Die persistence.xml ist in (der üblichen Maven Platz) target/test-classes/META-INF und sieht wie folgt aus:

<?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> 

Die Glassfish eingebettet EJBContainer, während seine Arbeit tut, gibt dies:

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 

Fehlerbehebung bei allen?

+0

Ich sollte erwähnen, ich verwende JTA - Container verwaltet Transaktionen - in beiden PUs. Es kommt mir vor, dass XA hier eine Voraussetzung wäre. Würde die Tatsache, dass meine Testdatenquellen nicht XA-konform sind, Ursache für diesen Fehler sein? –

+0

Die Datenquellen wurden aktualisiert, um XA zu verwenden. Kein Effekt. –

+0

Ob die Datenquellen XA sind oder nicht sollte nicht wichtig sein, zumindest nicht jetzt (es könnte später sein, wenn Sie sich entscheiden, beide EM gleichzeitig zu verwenden, aber das ist eine andere Geschichte). Funktioniert es mit nur einer PU? –

Antwort

5

Dies ist eine Kombination aus seltsamen Verhalten und Pilotfehler.

Zuerst der Pilotfehler. Der bestimmte JUnit-Testfall, den ich mir angesehen habe, war der eines Kollegen, und er wurde so benannt, als ob er selbst ein EJB wäre, wobei er unsere interne Namenskonvention befolgte. Dies ist wahrscheinlich ein Fehler beim Ausschneiden und Einfügen meines Kollegen.

Ich erwähne das, weil ich jedes Mal, wenn ich die Datei öffne, anstarrte, als wäre es selbst ein EJB.

Aber natürlich ist es kein EJB.

Aber auf mysteriöse Weise gibt es dort eine @PersistenceContext Annotation, und eine EntityManager, die nicht verwendet wird. Der Persistenzkontext hat ein Attribut von - Sie haben es erraten-- unitName="cx".

Also das seltsame Verhalten ist, dass irgendwo zwischen dem alten EJB-Container, der diesen Testfall in Ordnung, und jetzt begann der EJB-Container zu behandeln diese nicht-EJB, nicht-spezielle Klasse als gültiges Ziel für @PersistenceContext Injektion. Vielleicht wird dieser Testfall als eine gemanagte Bean behandelt, aber ich hatte den Eindruck, dass die verwalteten Beans in einer Nicht-CDI-Umgebung als solche annotiert werden mussten.

Jedenfalls, wenn ich diese unechte @PersistenceContext Annotation entfernt habe, hat alles gut funktioniert.

+0

Dies erklärt einen großen Teil des Problems. Allerdings ist der Wechsel zwischen GF 3.0.1 und GF 3.1 in der Tat seltsam (und es könnte irgendwo ein Fehler sein). Ist Ihr Archiv sogar CDI-fähig (hat es eine beans.xml)? –

+0

Nein, es ist absichtlich NICHT CDI-fähig, da Glassfish in der Vergangenheit alle möglichen schrecklichen Probleme mit CDI hatte. –

4

Wenn Sie versehentlich @PersistenceContext (name = "cx") anstelle von @PersistenceContext (unitName = "cx") setzen, erhalten Sie den gleichen Fehler, wenn alles andere funktioniert.

+1

Willkommen bei SO. Für eine spätere Bezugnahme sollten Sie eine ausführlichere und vollständigere Antwort in Erwägung ziehen, andernfalls könnten Sie downvoted/flagged werden. :) Glückliche Codierung. –

+1

Zugegeben, die Antwort ist ein wenig kurz, aber es war nur die Lösung für mein Problem. –