I have a JavaEE project that makes use of multiple persistence units. Is there any way to specify which persistence unit a particular JPA Entity belongs to? Some entities
The @PersistenceUnit
should be usable as well (I haven't tried it, yet, though)
e.g.
@PersistenceUnit(unitName="persistenceUnit2")
@Entity
class XPTO {
}
From the Javadoc (http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceUnit.html)
"Expresses a dependency on an EntityManagerFactory and its associated persistence unit."
unitName (Optional) The name of the persistence unit as defined in the persistence.xml file.
To specify which persistent unit an Entity
belongs to, use the persistence.xml
file:
<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>
Note the use of <exclude-unlisted-classes />
.
Also you can identify from which persistent unit an entity belongs by identifying the EntityManager that registered it.
A managed entity belongs to a persistence context, and a persistent context belongs to a persistence unit. So in this example:
@PersistenceContext(unitName="persistence-unit-1")
EntityManager em1;
@PersistenceContext(unitName="persistence-unit-2")
EntityManager em2;
em1.persist(entity1);
em2.persist(entity2);
entity1 belongs to persistence-unit-1 and entity2 belongs to persistence-unit-2. It's not so explicit like specifying the <class> tags in persistence.xml, but you can have the same entity classes in both persistent units and still differentiate to which unit each entity instance belongs.