JPA Entity-указать единицу сохраняемости?

У меня есть проект JavaEE, который использует несколько единиц персистентности. Есть ли способ указать, к какой единице персистентности принадлежит конкретный объект JPA? Некоторые объекты находятся в одном источнике данных, а другие-в моем втором источнике данных. Есть ли способ различать их с помощью аннотаций?

3 ответов


чтобы указать, какой постоянный блок Entity принадлежит, используйте :

<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 />.


на @PersistenceUnit также должен использоваться (я еще не пробовал)

например

@PersistenceUnit(unitName="persistenceUnit2")
@Entity
class XPTO {
}

из Javadoc (http://docs.oracle.com/javaee/6/api/javax/persistence/PersistenceUnit.html)

" выражает зависимость от EntityManagerFactory и связанного с ним единица сохранения состояния."

unitName (Необязательно) имя единицы сохраняемости, определенной в сохраняемости.XML файл.


также можно определить, из какой постоянной единицы принадлежит объект, определив 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, но вы можете иметь те же классы сущностей в обоих постоянных единицах и по-прежнему различают, к какой единице принадлежит каждый экземпляр сущности.