富客户端程序设计实例 - DAO层 - DAO 与 Hibernate 的 SessionFactory

11年前

        实际上 Spring 在整个DAO层面上一般只做了2 件事:@Repository托管存储层Bean,@Resource实例化org.hibernate.SessionFactory;和Assert.notNull(list, "entity is required");提供断言支持。代码如下:
  1. public class EmployeeDaoImpl implements BaseDao  
  2. {  
  3.     //Spring的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。  
  4.     protected SessionFactory sessionFactory;  
  5.   
  6.     public Session getSession()  
  7.     {  
  8.         return sessionFactory.getCurrentSession();  
  9.     }  
  10.   
  11.     @Resource  
  12.     public void setSessionFactory(SessionFactory sessionFactory)  
  13.     {  
  14.         this.sessionFactory = sessionFactory;  
  15.     }  
  16.   
  17.     /** 
  18.      * public <T> void saveInfo(List<T> list) 这是一个方法级别的泛型结构 
  19.      * T代表泛型,他也可以是其他字母,如:P、E、Q 
  20.      * 
  21.      * Assert.notNull(list, "entity is required"); 这是一个断言 
  22.      * 表示list如果为空,则不再继续执行下面的语句,转而在 
  23.      * 控制台上输出: "entity is required" 
  24.      * 
  25.      * **/  
  26.     public <T> void saveInfo(List<T> list)  
  27.     {  
  28.         Assert.notNull(list, "entity is required");  
  29.         for (T obj : list)  
  30.         {  
  31.             getSession().save(obj);  
  32.         }  
  33.         System.out.println("Function saveInfo has run");  
  34.     }  
  35.   
  36.     @Override  
  37.     public <T> void updateInfo(List<T> list)  
  38.     {  
  39.         Assert.notNull(list, "list不能为空");  
  40.         for (T obj  :  list)  
  41.         {  
  42.             getSession().update(obj);  
  43.         }  
  44.         System.out.println("Function updateInfo has run");  
  45.     }  
  46.   
  47.     public <T> List<T> find(Class<T> cla)  
  48.     {  
  49.         Assert.notNull(cla, "class不能为空");  
  50.         String hql = "from " + cla.getName();  
  51.   
  52.         return getSession().createQuery(hql).list();  
  53.     }  
  54.   
  55.     public <T> void saveOrUpdate(List<T> list)  
  56.     {  
  57.         Assert.notNull(list, "list不能为空");  
  58.         for (T obj  :  list)  
  59.         {  
  60.             getSession().saveOrUpdate(obj);  
  61.         }  
  62.     }  
  63.   
  64.     public <T> void delete(List<T> list)  
  65.     {  
  66.         Assert.notNull(list, "list不能为空");  
  67.         for (T obj : list)  
  68.         {  
  69.             getSession().delete(obj);  
  70.         }  
  71.     }  
  72.   
  73. }  

        从3.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。基于这一点,采用JTA的上下文相关session可以满足你一切需要
        如果使用的是全局事务(JTA事务):getCurrentSession () 使用当前的session; openSession() 重新建立一个新的session。如果使用getCurrentSession来创建session,在commit后,session自动被关闭,不用再session.close()。如果使用的是openSession方法创建的session,必须显示的关闭session,也就是调用session.close()方法。
        在一个应用程序中,如果DAO 层使用Spring 的 Hibernate 模板,通过Spring 来控制 session 的生命周期,则首选getCurrentSession()
        本质上,SessionFactory.getCurrentSession();调用了org.hibernate.impl.SessionImpl.java中对应的方法;这个类实现了org.hibernate.Session接口。这个类中对应的方法有很多,常用的有这些:save()、update()、delete() 和 public Query createQuery(String queryString) 。createQuery需要调用Query类中的list()方法。