Fixation “n'a pas Pu résoudre une unité de persistance...” erreurs lors de la PU est spécifié, trouvé

Je suis en cours d'exécution Glassfish 3.1-INSTANTANÉ à compter d'aujourd'hui (2010-11-12).

Je suis à l'aide de l'embedded EJBContainer.

Sur le chemin de la classe, tel que rapporté par le EJBContainer, j'ai un META-INF/persistence.xml. Ce fichier définit deux unités de persistance: l'un appelé "png" et un autre appelé "cx".

Sortie de débogage montre que Glassfish JPA deployer le trouve, et reconnaît à la fois le cx de PU et de la ngp PU.

La EJBContainer des bombes avec la suite de tout-trop-commune de la JPA erreur:

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)

Je souligne de nouveau que le déploiement dans les journaux d'au moins la deployer des rencontres à la fois les unités de persistance.

La classe qui veut utiliser le "cx" PU contient les habituels standard:

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

L'persistence.xml est présent dans (l'habitude Maven place) target/test-classes/META-INF et ressemble à ceci:

<?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 intégré EJBContainer, tout en faisant son travail, sorties ceci:

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

Dépannage recettes, n'importe qui?

Je dois mentionner que je suis en utilisant JTA--gérée par le conteneur des transactions, tant du PUs. Il me semble que XA serait une exigence ici. Serait le fait que mon test de sources de données ne sont pas XA conformes être la cause de cette erreur?
Mise à jour des sources de données à utiliser XA; aucun effet.
Si les sources de données sont XA ou pas ne devrait pas, du moins pas maintenant (peut-être plus tard, si vous décidez d'utiliser les deux EM en même temps, mais c'est une autre histoire). Ne travailler qu'avec une seule PU?
Oui. Eh bien, il est difficile de dire quelle partie est responsable de cette erreur. J'ai, dans le classpath, un AbstractDAO avec un em qui fait référence à la "ngp" unité de persistance, de sorte que l'unité doit être là pour l'injection. Mais rien dans le cas du test utilise l'entité gestionnaire, et le haricot sous test ne permet pas de s'étendre à partir de AbstractDAO. Cette installation A fonctionné avec une ancienne version de Glassfish incorporé--3.0.1-b02 si ma mémoire est bonne.
Temps, je suppose, de perdre le reste de l'après-midi d'ébullition bas un cas de test et de dépôt de Glassfish bug!

OriginalL'auteur Laird Nelson | 2010-11-12