java - 如何在 JPA 2 应用程序中拥有多个持久性单元?

标签 java jboss jboss7.x entitymanager

我的系统:

Eclipse 氧气/JPA 2/JSF 2.2/Hibernate 4/JBoss AS 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 生命周期所有细节的框架。这个框架为我提供了一个祖先类,我在子类中构建所有代码,而不关心管理 EntityManager。

这个祖先类注入(inject)或注释EntityManager,它是在第一次需要时由代码创建的,但是当我有超过一个PU。

我在祖先中编写了一段代码,以接受子类中的 @PersistenceUnit 注释,并在创建 EntityManagerFactory 时使用注释中设置的名称。当没有使用注释时,代码会找到第一个 PU 名称并使用它。因此,persistence.xml 中存在的第一个 PU 被理解为默认 PU 名称。

但是,即使不注入(inject)任何EntityManager,我仍然遇到上述异常。

我的解决方案中缺少什么?

最佳答案

如果您有多个持久性单元并使用 @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 且未指定持久性单元名称。这是模棱两可的。

关于java - 如何在 JPA 2 应用程序中拥有多个持久性单元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406501/

相关文章:

java - 缓存和池化有什么区别?

java - 代码更改未反射(reflect)在 .apk [Android Studio] 中

web-applications - 在 JBoss 7 Final 上部署应用程序的问题

java - 在 JBoss 7 中配置 MongoDB 数据源

java - 如何将 IBM Watson Assistant 聊天机器人添加到网页上?

java - 在 Adapter Android 的 getView 中搜索对象列表的有效方法

远程连接到 JBoss 4.2.3 中的身份验证

java - 哪些库可用于将对象表示形式转换为表示层中的 JSON/XML?

java - 由 : java. lang.LinkageError : loader constraint violation: when resolving method "org. apache.xmlbeans.XmlOptions.setLoadReplaceDocumentElement 引起

jsf - 在 Wildfly 中禁用焊接会奇怪地降低 JSF 性能