为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-09-29 10:43:08
我的系统:Eclipse 氧气/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我的问题:我使用的框架隐藏了 EntityManager 生命周期的所有细节。这个框架给了我一个祖先类,我在一个子类中构建我的所有代码,而不关心管理 EntityManager。这个祖先类没有注入ou注解EntityManager,它是在第一次需要时由代码创建的,但是当我有多个PU时,在应用程序启动时JBoss抛出了上述异常。我在祖先中编写了一个代码来接受子类中的@PersistenceUnit 注释,并在创建 EntityManagerFactory 时使用注释中设置的名称。当不使用注解时,代码找出第一个 PU 名称并使用它。因此,第一个存在于中的 PUpersistence.xml被理解为默认 PU 名称。但是,即使没有注入任何 EntityManagers,我仍然有上述异常。我的解决方案中缺少什么?
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

如果您有多个持久性单元并使用@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。那是模棱两可的。


分享


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信