hibernate之脏数据检查

HIbernate中有个名词---脏数据(dirty Data)检查!

其中“脏”并不是废弃,无用的数据,而是一个数据对象的信息发生改变之后的状态;

当我们从数据库中读取一个user对象;

例如:

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		//session将user对象读取出来
		TUser user = (TUser) session.load(TUser.class, new Integer(1));
		//当user对象的属性发生改变时,我们称之为“脏数据”
		user.setAge(new Integer(32));
		session.getTransaction().commit();

 当事务提交时,Hibernate会对session中的PO进行检测,判断是那些属性发生了变化,并将发生变化的数据更新到数据库中;

 

但是其中hibernate如何识别该对象被修改了(脏数据检查是如何进行的?)?

脏数据的检测的策略一般分为两种:

  • 数据对象监控

数据对象监控的方式,大体上是通过拦截器对数据对象的设值方法(setter)进行拦截;拦截器的实现可以借助Dynamic Proxy或者CGlib实现,一旦该对象的setter方法被调用,就将其标记为“待更新”,之后在数据库的操作时将其更新到对应的库表中;

  • 数据版本比对

在持久层框架中维持数据对象的最近读取版本,当数据提交时将提交数据与此版本对比,如果其发生变化则将其同步到数据库相对应的库表中;

 

HIbernate采取的是:数据版本比对

结合下实例:

		TUser user = (TUser) session.load(TUser.class, new Integer(1));
                session.beginTransaction();
		user.setAge(new Integer(32));
		session.getTransaction().commit();

1,加载id为1的user对象;

TUser user = (TUser) session.load(TUser.class, new Integer(1)); 

 假设此时数据库中id为1的user对象的age属性为20;

2,开启事务:

session.beginTransaction();

3,调用user的设置方法,将其age属性修改为“32”;

user.setAge(new Integer(32));

 4,事务提交;

session.getTransaction().commit();

 当session调用commit()时,会随即调用session.flush()方法,在flush方法中会刷新所有数据,执行SQL完成的动作;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值