如何在 JPA 2 应用程序中拥有多个持久性单元?
How to have more than one persistence units in an JPA 2 application?
我的系统:
Eclipse Oxygen/JPA2/JSF 2.2/Hibernate 4/JBossAS 7
我的情况:
我的应用程序在 persistence.xml
中声明了两个持久性单元 (PU)。
我的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
我的问题:
我使用的框架隐藏了 EntityManager 生命周期的所有细节。这个框架给了我一个祖先class,我在一个子class中构建我所有的代码,而不关心管理EntityManager。
这个祖先class 没有注入或者注解EntityManager,第一次需要的时候代码创建,但是上面的异常是[抛出的=46=] 当我有多个 PU 时,在应用程序启动期间。
我在祖先中写了一段代码,在我的子class中接受@PersistenceUnit注解,并在创建EntityManagerFactory时使用注解中设置的名称。当没有使用注释时,代码找出第一个 PU 名称并使用它。因此,persistence.xml
中存在的第一个 PU 被理解为默认 PU 名称。
然而,即使不注入任何 EntityManagers,我仍然有上述异常。
我的解决方案缺少什么?
如果您有多个持久性单元并使用 @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
而未指定持久性单元名称。那是模棱两可的。
我的系统:
Eclipse Oxygen/JPA2/JSF 2.2/Hibernate 4/JBossAS 7
我的情况:
我的应用程序在 persistence.xml
中声明了两个持久性单元 (PU)。
我的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
我的问题:
我使用的框架隐藏了 EntityManager 生命周期的所有细节。这个框架给了我一个祖先class,我在一个子class中构建我所有的代码,而不关心管理EntityManager。
这个祖先class 没有注入或者注解EntityManager,第一次需要的时候代码创建,但是上面的异常是[抛出的=46=] 当我有多个 PU 时,在应用程序启动期间。
我在祖先中写了一段代码,在我的子class中接受@PersistenceUnit注解,并在创建EntityManagerFactory时使用注解中设置的名称。当没有使用注释时,代码找出第一个 PU 名称并使用它。因此,persistence.xml
中存在的第一个 PU 被理解为默认 PU 名称。
然而,即使不注入任何 EntityManagers,我仍然有上述异常。
我的解决方案缺少什么?
如果您有多个持久性单元并使用 @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
而未指定持久性单元名称。那是模棱两可的。