2016-06-12 39 views
0

我正在開發一個項目,在這個項目中,我分離了EJB,使得它們只執行業務邏輯但不執行查詢。然後我也有執行查詢的DAO。對我來說,使用DAO的,我注入的DAO的EJB,並用註釋的方法@PostConstruct,我設置了EntityManager與EntityManager的在DAO在bean注入像波紋管:如何將注入statelesbean的實體管理器傳遞給dao而無需使用setter方法

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中?

+1

爲什麼不直接在實體管理器中注入實體管理器,而不是將其注入到服務中,而不應該使用它? –

+0

我想使用注入到bean中的EntityManager,我也不想使用DAO作爲JavaBean。再次,如果我使用@PersistenceContext將它注入DAO,實體管理器在使用它時變爲空。 – bavon

回答

2

只能在容器管理的豆中使用注入功能。你的dao類在容器管理之外沒有辦法將EntityManager注入到這個對象中。如果您需要注入功能,請將您的課程放入容器管理(EJB/CDI)中。順便避免使用不必要的接口use non interface view instead

0

您正在使用的Java EE 6或更高,充分利用ClazzDao作爲Managed Bean的確認,意味着要麼@ ApplicationScoped/@ SessionScoped

@ApplicationScoped 公共類ClazzDao實現ClazzDaoI

CDI可以注入ClazzDao ManagedBean 。

相關問題