2016-07-14 99 views
0

我在寫一個需要鏈接到用戶提供的持久性單元的框架。此前,該實體管理器使用@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容器。而且我不確定它在初始環境發生變化時是否有效。

那麼,我的實施是一個好方法嗎?

+1

這是很好的,只是要小心,有些容器都有不同的JNDI發佈的名稱,但可以基本JNDI路徑結合與部署描述符初始化的@Resource財產 – fantarama

回答

-1

不需要在persistanceContext中指定unitName。嘗試下面的一個..

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

它會工作。

感謝

+1

如果用戶有一個以上的PU,然後哪一個會在這種情況下被選中? –

+0

在這種情況下,嘗試將單位名稱作爲@PersistenceContext(unitName =「$ {persistence.UnitName}」)在您的屬性中添加persistence.UnitName。它會工作。 – Umamaheswar