关于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步将在上步的基础上进行更新,这样才正确。