富客戶端程序設計實例 - DAO層 - DAO 與 Hibernate 的 SessionFactory

Yangcl 11年前發布 | 6K 次閱讀


        實際上 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. }  
  74. </ol> </div> </div>


            從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()
    </span></div>

            本質上,SessionFactory.getCurrentSession();調用了org.hibernate.impl.SessionImpl.java中對應的方法;這個類實現了org.hibernate.Session接口。這個類中對應的方法有很多,常用的有這些:save()、update()、delete() 和 public Query createQuery(String queryString) 。createQuery需要調用Query類中的list()方法。




     本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!