【问题标题】:How to inject the EntityManager dynamically?如何动态注入EntityManager?
【发布时间】:2016-07-14 10:26:00
【问题描述】:

我正在编写一个需要链接到用户提供的持久性单元的框架。以前,实体管理器是使用@PersistenceContext 注解注入的,但这是一种静态方式:

public class MyItemReader implements ItemReader {

    @PersistenceContext(unitName="myPU")
    private EntityManager em;

    ...
}

现在,我希望分配是动态的。这样无论持久化单元名称是什么,仍然可以找到关联的实体管理器。这是我的实现:

public class MyItemReader implements ItemReader {

    private EntityManager em;

    @Inject @BatchProperty
    private String persistenceUnitName;

    @Override
    public void open(Serializable checkpoint) throws Exception {
        String path = "java:comp/env/" + persistenceUnitName;
        em = (EntityManager) InitialContext.doLookup(path);
        ...
    }

    ...
}

我的实现适用于 WildFly,但我不确定它是否适用于其他 Java EE 容器。而且我不确定它在初始上下文更改时是否有效。

那么,我的实现是一个好方法吗?

【问题讨论】:

  • 这很好,只是要注意某些容器有不同的 jndi 发布名称,但是您可以将基本 jndi 路径绑定到使用部署描述符初始化的 @Resource 属性

标签: jpa jakarta-ee cdi


【解决方案1】:

不需要在persistanceContext 中指定unitName。试试下面的一个..

@PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

它会起作用的。

谢谢

【讨论】:

  • 如果用户有多个PU,那么在这种情况下会选择哪一个?
  • 在这种情况下,请尝试将单元名称指定为 @PersistenceContext(unitName="${persistence.UnitName}") 在您的属性中添加 persistence.UnitName。它会起作用的。
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 2014-04-05
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2011-01-26
  • 2011-02-05
相关资源
最近更新 更多