我有一个用例,我认为我需要两个实体管理器,它们访问相同的持久性单元。所以基本上我想在同一个数据库上有两个持久化上下文。这可以通过@PersistenceContext
注释吗?
我想写下面的内容,但不知道如何告诉JPA注入两个不同的管理器实例。
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager otherEntityManager;
我想我可以切换到应用程序管理的事务,然后我可以使用工厂创建另一个。但是,如果不是绝对必要,我不想自己管理交易。
答案 0 :(得分:2)
你的陈述中有些含糊不清。你只使用一个'持久单位'吗?它与使用单数据源的约束不同。
您可以为单个数据源创建多个持久性单元。因此,如果您不受可以创建的持久性单元数量的限制,您可以在persistence.xml中为同一数据源声明2个持久单元,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<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="PU1"
transaction-type="JTA">
<jta-data-source>jdbc/myDS</jta-data-source>
<!-- Other properties -->
</persistence-unit>
<persistence-unit name="PU2"
transaction-type="JTA">
<jta-data-source>jdbc/myDS</jta-data-source>
<!-- Other properties -->
</persistence-unit>
</persistence>
然后,您可以创建2个实体管理器,如下所示
@PersistenceContext(unitName="PU1", type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@PersistenceContext(unitName="PU2", type = PersistenceContextType.EXTENDED)
private EntityManager otherEntityManager;
希望这有帮助。