我正在开发一个项目,我将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中设置它?
答案 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。