我在寫一個需要鏈接到用戶提供的持久性單元的框架。此前,該實體管理器使用@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