2016-07-14 98 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