Исправлены ошибки «Не удалось разрешить блок персистентности ...», если указан PU, найдено - PullRequest
7 голосов
/ 12 ноября 2010

Я использую Glassfish 3.1-SNAPSHOT с сегодняшнего дня (2010-11-12).

Я использую встроенный 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)

Я еще раз подчеркиваю, что журналы развертывания показывают, что, по крайней мере, развертыватель обнаруживает оба постоянных элемента.

Класс, который хочет использовать PU "cx", содержит обычный шаблон:

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

EJBContainer, встроенный в Glassfish, при выполнении своей работы выдает следующее:

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

Устранение неполадок, рецепты, кто-нибудь?

Ответы [ 3 ]

6 голосов
/ 13 ноября 2010

Это комбинация странного поведения и ошибки пилота.

Сначала ошибка пилота.

Конкретный тестовый пример JUnit, на который я смотрел, был коллегой, и он был назван так, как будто это был сам EJB, в соответствии с нашим внутренним соглашением об именах. Вероятно, это ошибка вырезать и вставить со стороны моего коллеги.

Я упоминаю об этом, потому что каждый раз, когда я открывал файл, я смотрел на него, как если бы он сам был EJB.

Но, конечно, это не EJB.

Однако, как ни странно, там есть аннотация @PersistenceContext и EntityManager, которая не используется. Контекст постоянства имеет атрибут - как вы уже догадались - unitName="cx".

Итак, странное поведение состоит в том, что где-то между старым контейнером EJB, который нормально выполнял этот тестовый пример, и теперь контейнер EJB начал рассматривать этот не-EJB, не специальный класс как допустимую цель для инъекции @PersistenceContext , Возможно, этот тестовый случай рассматривается как управляемый bean-компонент, но у меня сложилось впечатление, что управляемые bean-компоненты в среде без CDI необходимо аннотировать как таковые.

Так или иначе, как только я удалил эту ложную аннотацию @PersistenceContext, все заработало нормально.

4 голосов
/ 23 июля 2014

Если по ошибке вы поместите @PersistenceContext (name = "cx") вместо @PersistenceContext (unitName = "cx"), вы получите ту же ошибку, когда все остальное работает.

0 голосов
/ 10 июня 2018

Я столкнулся с той же проблемой. Ошибка была в названии одного из моих unitName

unitName="PUname error in one of my classes"
...