Wildfly中的多个持久性单元?

jon*_*aas 5 jpa persistence.xml wildfly

在Wildfly(9.0.2)应用程序中是否可以有两个持久性单元?

我得到"WFLYJPA0061:持久性的unitName未指定,并有应用程序部署部署2所持久性单元定义'碧玉的web.war’要么改变应用程序部署到只有一个持久性单元定义或指定的unitName每个参照.持久性单位."

unitName@PeristenceContext注释中指定了.我读了一些我可以禁用的地方

<!--
<subsystem xmlns="urn:jboss:domain:jpa:1.1">
    <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/>
</subsystem>
-->
Run Code Online (Sandbox Code Playgroud)

standalone.xml.这删除了错误消息,但也禁用了entityManagers的注入(在代码中引用它们的空指针)

我试图将持久性单元分成两个不同的ejb-jar,每个都有自己的persistence.xml,但由于它们仍然包含在同一个战争中,Wildfly仍然抱怨.

这两个持久性单元与hibernate一起使用,一个带有postgresql数据库,另一个带有用于ms访问的ucanaccess驱动程序.他们都分开工作.

fab*_*abe 10

这里有一个在我们的wildfly 8.x/9.x ejb应用程序中有效的例子:

首先定义persistence.xml中每个持久性单元的所有类,可以关闭未列出的类以禁用自动发现.

persistence.xml中

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
   <persistence-unit name="primary">
      <jta-data-source>java:jboss/datasources/primary_ds</jta-data-source>
      <class>whatever.primary.model.SomeEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>

   <persistence-unit name="secondary">
      <jta-data-source>java:jboss/datasources/secondary_ds</jta-data-source>
      <class>whatever.secondary.model.AnotherEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

如果你使用JBoss Developer Studio忽略警告(它只是一个日食缺陷):

定义了多个持久性单元 - 仅识别第一个持久性单元

Resources.java

package whatever.util;

import javax.annotation.Resource;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

public class Resources {

    @Produces
    @PersistenceContext(unitName = "primary")
    private EntityManager emPrimary;

    @Produces
    @PersistenceContext(unitName = "secondary")
    private EntityManager emSecondary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/primary_ds")
    private DataSource dsPrimary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/secondary_ds")
    private DataSource dsSecodnary;

}
Run Code Online (Sandbox Code Playgroud)

道主要的例子

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoPrimaryExample {

    @PersistenceContext(unitName = "primary")
    private EntityManager em;

    public void create(SomeEntity entity) {
        em.persist(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

道二次的例子

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoSecondaryExample {

    @PersistenceContext(unitName = "secondary")
    private EntityManager em;

    public void create(AnotherEntity entity) {
        em.persist(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

重要信息:如果您计划在同一事务中使用booth持久性单元,则应使用XA数据源.


小智 7

在persistence.xml中为persitence单元添加此选项为我解决了这个问题:

<property name="wildfly.jpa.default-unit" value="true"/>
Run Code Online (Sandbox Code Playgroud)


jon*_*aas 5

正如约翰·阿门特(John Ament)指出的那样,错误消息实际上指示了一个没有unitName的注入点(我在源代码中忘记了......)一旦我摆脱了它,一切就按预期进行了。当我实际上在 jboss AS 中发现了一些老问题时,我在谷歌上搜索这个问题也有点困惑,这实际上似乎曾经是一个问题。