HibernateTemplate

在學spring,看到一個帖子,問HibernateTemplate是不是自己有事務,大家都說有。如果有,那爲什麼需要在Spring的配置文件中配置事務呢?看了看HibernateTemplate的代碼,也看不出來

故請教大家:
HibernateTemplate中有事務處理嗎?
HibernateTemplate中有事務處理,那Spring爲何還需配置事務?



HibernateTemplate一般出現在DAO層。他所謂的事務一般都是針對單條SQL而言。因爲HibernateTemplate中的方法都是一次執行一條SQL的。
而spring中的事務是針對service層的,因爲在業務邏輯層,設計到業務時都是調用DAO層的基本方法組合實現邏輯的,比如轉賬,需要先扣,在增,此時對於service這屬於一個動作。

舉個例子吧。

比如執行單條SQL: UPDATE table_name SET name = 'xxx' WHERE id = ?

使用HibernateTemplate的update方法時,如果執行錯誤那麼數據庫是可以回滾的。

如果執行多條SQL:UPDATE table_name SET name = 'xxx' WHERE id = ?;UPDATE table_name1 SET name = 'xxx' WHERE id = ?

使用HibernateTemplate時,需要執行兩次update方法,但此時就會出現錯誤,HibernateTemplate是不會對兩條SQL的結果回滾的,可能會操成一條成功一條失敗,此時就需要spring的事務了。因爲兩條以上的SQL就算是業務邏輯的。



HibernateTemplate沒有設置session的事務屬性,HibernateTemplate的作用是保證session能夠正確的打開和關閉,避免手工管理session帶來的問題。
可以通過下面的方式處理事務


getHibernateTemplate().execute(new HibernateCallback() { 
              public Object doInHibernate(Session session) throws HibernateException, SQLException { 
                 session.connection().setAutoCommit(false); 
                  
                  Student stu1=new Student(); 
                 stu1.setName("aaaa");                 
           session.save(stu1); 
                  
                 Student stu2 = new Student(); 
                 session.save(stu2); 
                  
                 session.flush();//向數據庫發送sql 
                 session.connection().commit(); 
                 return null
             
         }); 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章