Можно ли передать EntityManager в качестве параметра через несколько бинов? - PullRequest
0 голосов
/ 28 марта 2019

Я знаю, что могу сделать следующее:

public class MyDao{

  private EntityManager em;

  public void setEm(EntityManager em){
     this.em = em;
  }
  ...

, а затем, используя @PostConstuct, передать EntityManager

public class MyBean{
  private EntityManager em;

  @Inject
  private MyDao myDao;

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

Но из-за ограничений архитектуры моего приложения яя не могу напрямую добавить MyDao в MyBean, я должен пройти мимо класса MyBusinessDao, поэтому я попробовал следующее, но получаю nullPointerExeception для значения EntityManager в 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);
    }
   ...

и в MyBusinessDaoя ввожу MyDao:

 public class MyBusinessDao {

    private EntityManager em;

    @Inject
    private MyDao myDao;

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

Следует отметить, что я не использую J2EE контейнер

Ответы [ 2 ]

2 голосов
/ 30 марта 2019

Вы можете реализовать метод источника CDI для предоставления EntityManager через внедрение CDI.

@ApplicationScoped
class EntityManagerProducer {

   @PersistenceContext(...)
   private EntityManager em;

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

Вы также можете внедрить EntityManagerFactory и вызвать emf.createEntityManager () в методе производителя и реализовать CDI-Disposer.метод, который закрывает EntityManager до завершения области.

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

Если у вас есть несколько контекстов персистентности, то реализуйте метод источника для каждого контекста персистентности и квалифицируйте их с помощью CDI-Qualifier.

0 голосов
/ 29 марта 2019

Я решил это так:

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);
    }
    ...
...