代码之家  ›  专栏  ›  技术社区  ›  AlexSC

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

  •  1
  • AlexSC  · 技术社区  · 6 年前

    我的系统:

    Eclipse/jpa2/jsf2.2/hibernate4/jbossas7

    我的状况:

    persistence.xml

    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
    

    这个祖先类 没有 注入ou注释EntityManager,它是在第一次需要时由代码创建的,但是当我有多个PU时,上面的异常是由JBoss在应用程序启动时抛出的。

    我在祖先中编写了一个代码来接受子类中的@PersistenceUnit注释,并在创建EntityManagerFactory时使用注释中设置的名称。当不使用注释时,代码会找出第一个PU名称并使用它。所以,第一个存在于 被理解为默认的PU名称。

    然而,即使没有注入任何entitymanager,我仍然有上面的例外。

    1 回复  |  直到 6 年前
        1
  •  1
  •   gpeche    6 年前

    如果您有多个持久化单元并使用 @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;
    

    错误消息告诉您的是,部署程序至少发现了一次 @持久性上下文 @持久性单位 不指定持久性单元名称。这是模棱两可的。