当前位置:首页-技术前沿-ORM/JPA-JPA

  • EJB3+JPA环境中的DAO
    作者: 本站会员  来源:bea  发布时间:2007-10-22 20:41:00
  • 在使用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;
     ....
    }
  • 评论 】 【收藏】 【 推荐给朋友 】 【字体: 】 【关闭
评论:共0条

发表评论:
评论: 
    

Copyright (C) 2005 EasyJF.com 简易java框架网 渝ICP备06004507号
如有意见请与我们联系