`

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完成的动作;

分享到:
评论

相关推荐

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    ### Hibernate4实战之第五部分:Hibernate的事务与并发 #### 一、事务基础概念 **事务(Transaction)** 是一组逻辑上紧密相连的操作集合。在数据库领域,事务具备ACID特性: - **原子性(Atomicity)**:事务内的所有...

    hibernate5--2.数据持久化及事务

    本章节我们将深入探讨Hibernate 5在数据持久化和事务管理方面的特性与用法。 **1. 数据持久化** 数据持久化是通过Hibernate的核心接口Session来实现的。Session提供了对数据库的 CRUD(创建、读取、更新、删除)...

    jsp hibernate 数据保存操作的原理.docx

    提交事务时,Hibernate会进行脏数据检查,确定实体对象的哪些属性发生了改变。对于确实发生了变化的属性,Hibernate将构造并执行相应的`UPDATE`语句。 ##### 3. 特别注意事项 需要注意的是,一旦通过`update()`...

    Hibernate大总结/Hibernate面试题大全

    **StatelessSession** 是Hibernate中提供的另一种Session类型,与普通Session不同,它不具备一级缓存功能,也不参与二级缓存的操作,不会自动进行脏检查等操作。这意味着在使用StatelessSession时,开发者需要手动...

    Hibernate框架技术课件ppt

    Hibernate支持脏检查和自动更新,同时引入了二级缓存机制,提高性能。学习者将了解何时启用缓存以及如何配置缓存提供商。 9. 懒加载与立即加载: Hibernate提供了懒加载和立即加载机制来控制关联对象的加载时机,...

    hibernate_flush 深入了解

    1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入或删除。这包括对持久化对象的脏检查,即比较对象的当前状态和上次持久化时的状态。 2. **生成SQL语句**:根据对象的状态...

    Hibernate(session管理)

    8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...

    Hibernate 事务和并发控制

    乐观锁假设并发冲突很少发生,通常在数据更新时检查版本号或时间戳,如果发现有其他事务在此期间修改了数据,就回滚事务。在Hibernate中,可以通过在实体类的属性上添加@Version注解来实现乐观锁。 悲观锁则是在...

    hibernate乐观锁和悲观锁学习

    `dirty`通过检测对象的脏属性来判断,而`all`则检查所有属性。由于`version`方式在数据脱离Session后仍然有效,所以它是实际应用中最常用的选择。 在悲观锁中,Hibernate提供了多种锁模式,如`LockMode.NONE`、`...

    精通Hibernate源码.rar

    Hibernate的缓存更新策略包括查询更新、脏检查和版本机制等,确保缓存中的数据与数据库保持同步。例如,乐观锁通过版本字段防止并发更新冲突,而悲观锁则通过数据库的锁定机制来实现。 9. **级联操作** 在映射...

    Hibernate学习指南pdf

    - **脏检查**: 自动检测对象的状态变化,确保在必要时更新数据库。 - **延迟加载**: 仅在需要时加载关联的对象,优化性能。 - **外键联接**: 支持外键联接的查询,提高查询效率。 - **SQL生成**: 运行时动态生成SQL...

    hibernate事务,并发及缓存管理实例

    乐观锁则在更新数据时检查是否被其他事务修改,通常通过版本号或时间戳实现。Hibernate还支持LockMode,包括READ、WRITE、UPGRADE和OPTIMISTIC等,以适应不同级别的并发控制需求。 三、缓存管理 缓存技术可以显著...

    传智播客-hibernate框架开发视频第day01-day04资料

    - 改动追踪与脏检查:理解Hibernate如何检测对象状态的变化,自动执行更新操作。 - 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化...

    hibernate的session.flush

    `Session.flush()`的实现涉及到对持久化对象的跟踪、脏检查算法以及与JDBC连接的交互,这些都是深入学习Hibernate时的重要内容。 总结来说,`Session.flush()`是Hibernate中不可或缺的一部分,它确保了数据库与应用...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    4. **实体状态异常**: Hibernate在操作实体时会根据其生命周期状态进行处理,如果出现“ detached entity passed to persist”之类的错误,可能是因为实体状态管理不当。确保在操作实体前正确处理其状态(如merge、...

    hibernate4.1

    同时,实体状态管理更加智能,可以更好地处理脏检查和变更检测,以提升整体性能。 在配置方面,4.1版本提供了更灵活的XML和基于注解的配置方式。开发者可以选择使用传统的hibernate.cfg.xml文件,或者使用@Entity...

    Hibernate Developer Guide

    事务管理是Hibernate的核心功能之一,它确保了数据的一致性和完整性。 ##### 2.1 定义事务 Hibernate支持多种事务定义方式,包括程序式和声明式事务。 ##### 2.2 物理事务 **2.2.1 物理事务-JDBC** 当使用JDBC...

    hibernate非常全面总结文档

    自动脏检查是 Hibernate 的一个重要特性,它能够在事务提交时检测到对象状态的变更,并自动更新到数据库。通过设置对象为只读模式,可以阻止 Hibernate 对其进行脏检查,从而避免不必要的数据库更新。 【集合类型与...

    Hibernate悲观锁和乐观锁的实现

    **乐观锁**(Optimistic Lock)则相对乐观,它假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,只有在更新数据时才会检查在此期间数据是否被其他事务修改过。在Hibernate中,乐观锁通常通过版本字段...

Global site tag (gtag.js) - Google Analytics