如何在不使用setter方法的情况下将statelesbean中注入的实体管理器传递给dao

时间:2016-06-12 19:10:59

标签: java hibernate jpa ejb ejb-3.1

我正在开发一个项目,我将EJB分开,这样他们只执行业务逻辑但不执行查询。然后我还有执行查询的DAO。对于我来说,使用DAO,我在EJB中注入了DAO,并使用注释@PostConstruct的方法,我在DAO中设置了EntityManager,并在bean中注入了EntityManager,如下所示:

public class ClazzDao implements ClazzDaoI{

  private EntityManager em;

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

  public List<Entity> list(){
      return em.createQuery("FROM Entity e").getResultList();
  }

}

和EJB

@Stateless    
public class ClazzBean implements ClazzBeanI{
  @PersistenceContext
  private EntityManager em;

  @Inject
  private ClazzDaoI clazzDao;

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

  public BigDecimal sendEmailToMembers(){

     List<Entity> members = clazzDao.list();
     //do some stuff with data like say send emails...

  }

}

有没有办法可以让DAO使用EJB中注入的实体管理器,而无需在EJB的@PostConstruct中设置它?

2 个答案:

答案 0 :(得分:2)

您只能在容器托管bean 中使用注入功能。你的dao类在容器管理之外,没办法将EntityManager注入到这个对象中。如果需要注入功能,请将您的课程置于容器管理(EJB / CDI)中。顺便说一下,避免使用不必要的接口use non interface view instead

答案 1 :(得分:0)

确定您使用的是JAVA EE 6 OR HIGHER,将ClazzDao设为Managed Bean,意味着@ ApplicationScoped / @SessionScoped

@ApplicationScoped 公共类ClazzDao实现了ClazzDaoI

CDI可以注入ClazzDao ManagedBean。