Jpa 如何动态注入EntityManager?

Jpa 如何动态注入EntityManager?,jpa,jakarta-ee,cdi,Jpa,Jakarta Ee,Cdi,我正在编写一个框架,它需要链接到用户提供的持久性单元。以前,实体管理器是使用@PersistenceContext注释注入的,但这是一种静态方式: public class MyItemReader implements ItemReader { @PersistenceContext(unitName="myPU") private EntityManager em; ... } 现在,我希望作业是动态的。因此,无论持久性单元名称是什么,仍然可以找到关联的实体管理

我正在编写一个框架,它需要链接到用户提供的持久性单元。以前,实体管理器是使用@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中工作,但我不确定它是否可以在其他JavaEE容器中工作。我不确定它在初始环境改变时是否有效


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

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

@PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
它会起作用的


谢谢

这很好,请注意某些容器具有不同的jndi发布名称,但是您可以将基本jndi路径绑定到使用部署描述符初始化的@Resource属性。如果用户有多个PU,那么在这种情况下将选择哪一个?在这种情况下,请尝试将单元名称指定为@PersistenceContextInitName=${persistence.UnitName}在属性中添加persistence.UnitName。它会起作用。