是否可以通过多个bean将EntityManager作为参数传递?

时间:2019-03-28 19:47:36

标签: jpa ejb cdi

我知道我可以执行以下操作:

#myList li{display:none;
}
#loadMore {
    color:green;
    cursor:pointer;
}
#loadMore:hover {
    color:black;
}

然后使用public class MyDao{ private EntityManager em; public void setEm(EntityManager em){ this.em = em; } ... 传递@PostConstuct

EntityManager

但是由于我的应用程序的体系结构限制,我无法直接将MyDao注入MyBean中,因此我应该通过MyBusinessDao类,因此我尝试了以下操作,但是我得到的public class MyBean{ private EntityManager em; @Inject private MyDao myDao; @PostConstruct private void init(){ myDao.setEm(em); } ... nullPointerExeception在MyDao中:

EntityManager

在MyBusinessDao中,我注入MyDao:

    public class MyBean{

    private EntityManager em;

    public MyBean(){
        em = createEntityManager();
    }

    private EntityManager createEntityManager(){
        //dynamically create the EntityManager
    }

    @Inject
    private MyBusinessDao myBusinessDao;

    @PostConstruct
    private void init(){
       myBusinessDao.setEm(em);
    }
   ...

我应该提到我没有使用 public class MyBusinessDao { private EntityManager em; @Inject private MyDao myDao; @PostConstruct private void init(){ myDao.setEm(em); } ... 容器

2 个答案:

答案 0 :(得分:2)

您可以实现CDI生产者方法,以通过CDI注入提供EntityManager。

@ApplicationScoped
class EntityManagerProducer {

   @PersistenceContext(...)
   private EntityManager em;

   @Produces
   @RequestScoped
   public EntityManager produceEm() {
      return em;
   }
}

您还可以注入EntityManagerFactory并在producer方法中调用emf.createEntityManager()并实现一个CDI-Disposer方法,该方法将在完成作用域之前关闭EntityManager。

public void dispose(@Disposes EntityManager em) { ... }

如果您有多个持久性上下文,则为每个持久性上下文实现一个生产者方法,并使用CDI-Qualifier对它们进行限定。

答案 1 :(得分:-2)

我是这样解决的:

public class MyBusinessDao {

    private EntityManager em;

    @Inject
    private MyDao myDao;

    private void setEm(EntityManager em){
    this.em = em;
    //and here i call the setEm method of myDao also
    myDao.setEm(em);
    }
    ...