【问题标题】:Container-managed EntityManager: multiple managers for single persistence unit?容器管理的EntityManager:单个持久单元的多个管理器?
【发布时间】:2013-10-14 14:39:02
【问题描述】:

我有一个用例,我认为我需要两个访问同一个持久性单元的实体管理器。所以本质上我想在同一个数据库上有两个持久性上下文。这可以通过@PersistenceContext 注释实现吗?

我想写如下内容,但不知道如何告诉 JPA 注入两个不同的管理器实例。

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager otherEntityManager;

我想我可以切换到应用程序管理的事务,然后我可以使用工厂创建另一个事务。但我不想自己管理交易,如果不是绝对必要的话。

【问题讨论】:

    标签: java jpa java-ee-6


    【解决方案1】:

    你的陈述有些模棱两可。您是否受限于仅使用一个“持久单元”?与使用单一数据源进行约束不同。

    您可以为单个数据源创建多个持久单元。因此,如果您不受可以创建的持久单元数量的限制,您可以在 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;
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 2021-07-02
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多