關於HibernateTemplate 的 TemplateFlushMode 設置作些自己的看法
首先介紹 TemplateFlushMode,它表示數據發送到數據的模式(何時發送sql語句)
包含設置有:
Never 從不提交,適用於只讀工作單元
Auto 自動提交(默認方式),只在數據有變化時再提交更智能些
Eager 馬上提交,很直接
Commit 事務提交時再提交,也很直接
應用場景:
1.在正常情況下,使用Auto
2.該Dao只用查詢不作更改操作,請使用Never。
3.混合模式需要謹慎考慮,
當同時混合使用ORM方式和ADO.Net方式操作(指增,刪,改操作)數據時最好使用Eager模式。
否則有可能會造成錯誤的數據覆蓋。
舉例如:
//新聞實體類
public class News{
public int Id{get;set;}//標識
public string Title{get;set;}//標題
public int ViewCount{get;set;}//點擊數
}
...
ISession Session{get;set;}
IUserDao UserDao{get;set;}
public void UpdateNews(int id,string title)
{
//第1步:使用ORM方式查詢更新標題
var entity=UserDao.Get(id);
entity.Title=title;
UserDao.Update(entity);
//第2步:使用ADO.Net方式更新浏覽數
Session.CreateSQLQuery("UPDATE [USER] SET [VIEW_COUNT]=[VIEW_COUNT]+1 WHERE [ID]="+id.ToString()).ExecuteUpdate();
}
分析,
如果 TemplateFlushMode 設置為 Commit ,第1步更新將遲於第2步造成 第2步的更新結果被覆蓋。
此時 TemplateFlushMode 應該設置為Never,這樣第1步更新將馬上執行,第2步將在上步的基礎上進行更新,這樣才正確。