我有一个JavaEE项目,它利用了多个持久化单元。 有没有办法指定特定的JPA实体属于哪个持久化单元? 一些实体在一个数据源中,而其他实体在我的第二个数据源中。 是否有一种方法可以使用注释区分这两者?
我有一个JavaEE项目,它利用了多个持久化单元。 有没有办法指定特定的JPA实体属于哪个持久化单元? 一些实体在一个数据源中,而其他实体在我的第二个数据源中。 是否有一种方法可以使用注释区分这两者?
要指定Entity
属于哪个持久单元,使用persistence.xml
文件:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="user" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/myApp</jta-data-source>
<class>com.company.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- properties -->
</properties>
</persistence-unit>
<persistence-unit name="data" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/myApp_data</jta-data-source>
<!--<mapping-file>META-INF/myApp_entities.xml</mapping-file> You can also use mapping files.-->
<class>com.company.Data</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- properties -->
</properties>
</persistence-unit>
</persistence>
注意使用了<exclude-unlisted-classes />
标签。
您可以通过识别注册它的EntityManager来确定实体属于哪个持久化单元。
托管实体属于持久化上下文,而持久化上下文属于持久化单元。因此,在这个例子中:
@PersistenceContext(unitName="persistence-unit-1")
EntityManager em1;
@PersistenceContext(unitName="persistence-unit-2")
EntityManager em2;
em1.persist(entity1);
em2.persist(entity2);
entity1属于persistence-unit-1,而entity2属于persistence-unit-2。这不像在persistence.xml中指定<class>标签那样明确,但是你可以在两个持久单元中拥有相同的实体类,并且仍然可以区分每个实体实例属于哪个单元。
@PersistenceUnit
应该也可以使用(尽管我还没有尝试过)
例如:
@PersistenceUnit(unitName="persistenceUnit2")
@Entity
class XPTO {
}
来自Javadoc(http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceUnit.html)
“表示对EntityManagerFactory及其关联的持久性单元的依赖性。”
unitName (可选)在persistence.xml文件中定义的持久性单元的名称。
exclude-unlisted-classes=true
。 - baderaPersistenceUnit
(一个或多个),而不必在persistence.xml中列出所有实体类...这对于几百个实体来说非常烦人...甚至更少。 - baderaexclude-unlisted-classes
为false,则所有实体都属于所有持久性单元。我使用带有包含的Hibernate的Wildfly 8.2.1。我认为我必须对这个答案进行负面评价,因为这是一个不起作用的建议。或者请提供证明表明它是有效的。 - badera