Как иметь более одной единицы персистентности в приложении JPA 2? - PullRequest
0 голосов
/ 19 сентября 2018

Моя система:

Eclipse Oxygen / JPA 2 / JSF 2.2 / Hibernate 4 / JBoss AS 7

Мое состояние:

У меня есть приложение с двумя постоянными единицами (PU), объявленными в persistence.xml.

Моя ошибка JBoss:

Caused by: java.lang.IllegalArgumentException: JBAS011470: Persistence unitName was not specified and there are 2 persistence unit definitions in application deployment "test.war".  Either change the application to have only one persistence unit definition or specify the unitName for each reference to a persistence unit.
    at org.jboss.as.jpa.container.PersistenceUnitSearch.resolvePersistenceUnitSupplier(PersistenceUnitSearch.java:69)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.getPersistenceUnit(JPAAnnotationParseProcessor.java:284)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.getBindingSource(JPAAnnotationParseProcessor.java:220)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.processField(JPAAnnotationParseProcessor.java:151)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.processPersistenceAnnotations(JPAAnnotationParseProcessor.java:118)
    at org.jboss.as.jpa.processor.JPAAnnotationParseProcessor.deploy(JPAAnnotationParseProcessor.java:90)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.0.Final.jar:7.1.0.Final]
    ... 5 more

Myпроблема:

Я использую структуру, которая скрывает все детали в жизненном цикле EntityManager.Этот фреймворк предоставляет мне класс предков, и я строю весь свой код в подклассе, не заботясь об управлении EntityManager.

Этот класс предков не вводит или комментирует EntityManager, он создаетсякодом при необходимости в первый раз, но вышеупомянутое исключение выдается JBoss во время запуска приложения, когда у меня более одного PU.

Я написал код в предке, чтобы принять аннотацию @PersistenceUnit в моемподкласс и использовать имя, установленное в аннотации при создании EntityManagerFactory.Когда аннотации не используются, код находит первое имя PU и использует его.Итак, первый PU, существующий в persistence.xml, понимается как имя PU по умолчанию.

Однако, даже не вводя никаких EntityManager, у меня все еще есть вышеупомянутое исключение.

Чего не хватает в моемрешение?

1 Ответ

0 голосов
/ 19 сентября 2018

Если у вас есть более одного персистентного юнита и вы используете аннотации @PersistenceContext / @PersistenceUnit, вы должны указать имя вашего юнита, чтобы аннотация была однозначной.

Поэтому вместо:

@PersistenceContext
private EntityManager manager;

вы должны использовать:

@PersistenceContext(unitName = "<unit name in persistence.xml>")
private EntityManager manager;

И вместо:

@PersistenceUnit
private EntityManagerFactory managerFactory;

вы должны использовать:

@PersistenceUnit(unitName = "<unit name in persistence.xml>")
private EntityManagerFactory managerFactory;

То, что сообщение об ошибке говорит вам,что развертыватель обнаружил, по крайней мере, одно вхождение @PersistenceContext / @PersistenceUnit без указания имени единицы сохраняемости.Это неоднозначно.

...