在學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
;
}
});