gpt4 book ai didi

jpa - 如何动态修改@PersistenceContext 中的unitName

转载 作者:行者123 更新时间:2023-12-01 09:53:14 25 4
gpt4 key购买 nike

我正在使用 JPA 2.1,我有这样的东西

public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName="first_PU")
private EntityManager em;
...

如何动态修改 @PersistenceContext(unitName = "somer_PU") 中的 unitName 以使用其他实体管理器?这可能吗?

VERY IMPORTANT UPDATE

我有一个已部署的应用程序,persistence.xml 如下所示:

<persistence-unit name="db1" transaction-type="JTA">
<jta-data-source>java:/jboss/datasources/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jboss.entity.manager.jndi.name" value="java:app/entitymanager/db1"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:app/entitymanagerfactory/db1"/>
</properties>

在运行时,可以修改 persistence.xml 并添加另一个持久性单元,但我需要一种方法来获取我需要的实体管理器,方法是传递持久性单元的名称或其他名称,然后将其用于我想要的用途。然后我可以提供持久性单元的另一个名称并获得一个不同的实体管理器。当然,我希望交易过程仍然是容器管理

最佳答案

相信我,您不想修改现有 PersistenceContext 中的 unitName。我几乎可以肯定,您想要实现的只是让第二个 EntityManager 指向不同的数据库,对吧?

那么一个自然的方法是:

public class SomeClass {

@PersistenceContext(unitName = "first_PU")
EntityManager firstEntityManager;

@PersistenceContext(unitName = "somer_PU")
EntityManager secondEntityManager;

// ...
}

个人建议

  1. 另请注意,使用 EJB 时,您不必为 EntityManager 创建 Producer 方法,只需键入 @PersistenceContext(...)就够了。

  2. 也非常不鼓励以下内容:

    @Produces
    @PersistenceContext(unitName="first_PU")
    private EntityManager em;

    因为默认作用域是@Dependent@RequestScoped@TransactionScoped 会好得多。

  3. 您可以使用 CDI 和注释限定符代替硬编码的单元名称:

    @Inject
    private @FirstDB EntityManager firstEntityManager;

    @Inject
    private @SecondDB EntityManager secondEntityManager;

    但是你需要:

    @Produces
    @RequestScoped // or other
    @FirstDB
    public EntityManager createEntityManagerA() {
    return firstEmf.createEntityManager();
    }

    @Produces
    @RequestScoped // or other
    @SecondDB
    public EntityManager createEntityManagerB() {
    return secondEmf.createEntityManager();
    }

有关 CDI 和生成多个 EntityManagers 的大量有用信息,您可以找到 here .

关于jpa - 如何动态修改@PersistenceContext 中的unitName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33790875/

25 4 0
文章推荐: spring - 如何读取和重置 Spring 执行器指标?
文章推荐: java - JToolBar 项目顺序
文章推荐: java - 更新 List 中的对象仅影响特定字段。 (合并)