在使用EJB2.x+Hibernate的时候,我们如果需要用DAO组件封装Hibernate的持久化逻辑时,DAO组件通常采用POJO(普通 java对象实现)。我们可以通过Hibernate中的getCurrentSession在DAO的实现中获得与当前事务上下文邦定的 Hibernate Session对象.
这种情况在使用EJB3+JPA的情况下会有所不同,JPA没有提供类似Hibernate中getCurrentSession类似的方法,这时如果想使用于当前JTA邦定的EntityManager对象,采用POJO实现DAO组件时我们只能通过参数将注入到EJB中的EntityManager对象传入DAO组件中。
而实际上EJB3容器提供了符合这种需求的依赖注入功能,但是这种依赖注入功能只能用于EJB中。由于EJB3采用POJO实现EJB的方式大大简化了开发和测试的复杂度,所以建议在EJB3+JPA的环境中采用EJB实现DAO,并且这样实现的DAO可以方便的注入到其它需要使用这个DAO的EJB中。
以下代码片断对比了两种写法,显然第二种方案更为便捷。
public interface CustomerDAO{
public List<Customer> findCustomersByName(String name);
}
方案一:
public class CustomerDAOImp1 implements CustomerDAO{
private EntityManager em;
public CustomerDAOImp1(EntityManager em){
this.em=em;
}
public List<Customer> findCustomersByName(String name){
...
}
}
@Stateless
public class CustomerManagerBean {
@PersistenceContext
private EntityManager em;
....
{
CustomerDAO dao=new CustomerDAOImp1(em);
...
}
}
方案二:
@Local(CustomerDAO.class)
@Stateless
public class CustomerDAOImp1 implements CustomerDAO{
@PersistenceContext
private EntityManager em;
public List<Customer> findCustomersByName(String name){
...
}
}
@Stateless
public class CustomerManagerBean {
@EJB
CustomerDAO dao;
....
}