富客戶端程序設計實例 - DAO層 - DAO 與 Hibernate 的 SessionFactory
實際上 Spring 在整個DAO層面上一般只做了2 件事:@Repository托管存儲層Bean,@Resource實例化org.hibernate.SessionFactory;和Assert.notNull(list, "entity is required");提供斷言支持。代碼如下:
- public class EmployeeDaoImpl implements BaseDao
- {
- //Spring的注解形式:@Repository、@Service、@Controller,它們分別對應存儲層Bean,業務層Bean,和展示層Bean。
- protected SessionFactory sessionFactory;
- public Session getSession()
- {
- return sessionFactory.getCurrentSession();
- }
- @Resource
- public void setSessionFactory(SessionFactory sessionFactory)
- {
- this.sessionFactory = sessionFactory;
- }
- /**
- * public <T> void saveInfo(List<T> list) 這是一個方法級別的泛型結構
- * T代表泛型,他也可以是其他字母,如:P、E、Q
- *
- * Assert.notNull(list, "entity is required"); 這是一個斷言
- * 表示list如果為空,則不再繼續執行下面的語句,轉而在
- * 控制臺上輸出: "entity is required"
- *
- * **/
- public <T> void saveInfo(List<T> list)
- {
- Assert.notNull(list, "entity is required");
- for (T obj : list)
- {
- getSession().save(obj);
- }
- System.out.println("Function saveInfo has run");
- }
- @Override
- public <T> void updateInfo(List<T> list)
- {
- Assert.notNull(list, "list不能為空");
- for (T obj : list)
- {
- getSession().update(obj);
- }
- System.out.println("Function updateInfo has run");
- }
- public <T> List<T> find(Class<T> cla)
- {
- Assert.notNull(cla, "class不能為空");
- String hql = "from " + cla.getName();
- return getSession().createQuery(hql).list();
- }
- public <T> void saveOrUpdate(List<T> list)
- {
- Assert.notNull(list, "list不能為空");
- for (T obj : list)
- {
- getSession().saveOrUpdate(obj);
- }
- }
- public <T> void delete(List<T> list)
- {
- Assert.notNull(list, "list不能為空");
- for (T obj : list)
- {
- getSession().delete(obj);
- }
- }
- } </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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
推薦閱讀
富客戶端程序設計實例 - DAO層 - DAO 與 Hibernate 的 SessionFactory
實際上 Spring 在整個DAO層面上一般只做了2 件事: @Repository 托管 存儲層Bean, @Resource 實例 化org.hibernate.SessionFactory...
富客戶端程序設計實例 - DAO層 - 方法泛型與斷言的使用
[javascript] view plain copy public <T> void saveInfo(List<T>?list) { Assert.notNull(list, "entit...
富客戶端程序設計實例 - Bean(DAO+Service層) - Spring 為什么要對 Bean 進行托管?
換句話就是Spring進行依賴注入的好處是什么。以BaseService、 EmployeeServiceImpl 和 EmployeeAction 這三個類為例,部分代碼如下所示: publi...
富客戶端程序設計實例 - Bean(DAO+Service層) - Spring 注解對 Bean 的托管
Spring的注解形式: @Repository、@Service、@Controller , 它們分別對應存儲層Bean,業務層Bean,和展示層Bean。 事實上在Spring中只有Bean...