我在写一个需要链接到用户提供的持久性单元的框架。此前,该实体管理器使用@PersistenceContext
注释注入,但是这是一个静态的方式:如何动态注入EntityManager?
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财产 – fantarama