脏数据检查策略一般有两种:
1. 数据对象监控
数据对象监控的实现方式,大体上是通过拦截器对数据对象的设置方法(setter)进行拦截,拦截器的实现可以借助Dynamic Proxy或CGlib实现。一旦数据对象的设置方法被调用(通常这也就意味着数据对象的内容发生变化),则将其标志为“待更新”状态,之后在数据库操作时将其更新到对应的数据表。
2. 数据版本比对
在持久层框架中维持数据对象 的最近读取版本,当数据提交时将提交数据与此版本进行比对,如果 发生变化 则将其同步到数据库相应的库表。
hibernate 使用的是第二种策略。
实例:
TUser user = (TUser)session.load(TUser.class,new Integer(1));
Transaction tx = session.beginTransaction();
user.setName("111");
tx.commit();
1. 加载
2.启动事务
3.设值
4.提交;
提交事件随即调用Session.flush:
public void commit() throws HibernateException{
......
if(session.getFlushMode() != FlushMode.NEVER)
session.flush();
......
}
Sesson.flush()方法中,会完成两个主要任务:
public void flush() throws HibernateException{
......
flushEverything();//刷新所有数据
execute();//执行数据库SQL完成持久化操作
......
}
flushEverything会首先完成 一些预处理工作(如调用对应的interceptor、协同级联关系等);之后,即调用flushEntities方法对当前Session中的实体对象进行刷新,而这个过程也是脏数据判定的关键。
本文介绍了Hibernate识别脏数据的两种策略:数据对象监控和数据版本比对,并详细阐述了Hibernate采用的数据版本比对策略。通过示例展示了如何在Hibernate中进行数据操作,最后指出在提交事务时,Hibernate会进行flush操作,判断并更新脏数据。

2296

被折叠的 条评论
为什么被折叠?



