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的事务与并发 #### 一、事务基础概念 **事务(Transaction)** 是一组逻辑上紧密相连的操作集合。在数据库领域,事务具备ACID特性: - **原子性(Atomicity)**:事务内的所有...
本章节我们将深入探讨Hibernate 5在数据持久化和事务管理方面的特性与用法。 **1. 数据持久化** 数据持久化是通过Hibernate的核心接口Session来实现的。Session提供了对数据库的 CRUD(创建、读取、更新、删除)...
提交事务时,Hibernate会进行脏数据检查,确定实体对象的哪些属性发生了改变。对于确实发生了变化的属性,Hibernate将构造并执行相应的`UPDATE`语句。 ##### 3. 特别注意事项 需要注意的是,一旦通过`update()`...
**StatelessSession** 是Hibernate中提供的另一种Session类型,与普通Session不同,它不具备一级缓存功能,也不参与二级缓存的操作,不会自动进行脏检查等操作。这意味着在使用StatelessSession时,开发者需要手动...
Hibernate支持脏检查和自动更新,同时引入了二级缓存机制,提高性能。学习者将了解何时启用缓存以及如何配置缓存提供商。 9. 懒加载与立即加载: Hibernate提供了懒加载和立即加载机制来控制关联对象的加载时机,...
1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入或删除。这包括对持久化对象的脏检查,即比较对象的当前状态和上次持久化时的状态。 2. **生成SQL语句**:根据对象的状态...
8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...
乐观锁假设并发冲突很少发生,通常在数据更新时检查版本号或时间戳,如果发现有其他事务在此期间修改了数据,就回滚事务。在Hibernate中,可以通过在实体类的属性上添加@Version注解来实现乐观锁。 悲观锁则是在...
`dirty`通过检测对象的脏属性来判断,而`all`则检查所有属性。由于`version`方式在数据脱离Session后仍然有效,所以它是实际应用中最常用的选择。 在悲观锁中,Hibernate提供了多种锁模式,如`LockMode.NONE`、`...
Hibernate的缓存更新策略包括查询更新、脏检查和版本机制等,确保缓存中的数据与数据库保持同步。例如,乐观锁通过版本字段防止并发更新冲突,而悲观锁则通过数据库的锁定机制来实现。 9. **级联操作** 在映射...
- **脏检查**: 自动检测对象的状态变化,确保在必要时更新数据库。 - **延迟加载**: 仅在需要时加载关联的对象,优化性能。 - **外键联接**: 支持外键联接的查询,提高查询效率。 - **SQL生成**: 运行时动态生成SQL...
乐观锁则在更新数据时检查是否被其他事务修改,通常通过版本号或时间戳实现。Hibernate还支持LockMode,包括READ、WRITE、UPGRADE和OPTIMISTIC等,以适应不同级别的并发控制需求。 三、缓存管理 缓存技术可以显著...
- 改动追踪与脏检查:理解Hibernate如何检测对象状态的变化,自动执行更新操作。 - 异步操作与事务管理:学习如何在Hibernate中处理并发,以及事务的隔离级别和回滚规则。 4. **Day04:优化与实战** - 查询优化...
`Session.flush()`的实现涉及到对持久化对象的跟踪、脏检查算法以及与JDBC连接的交互,这些都是深入学习Hibernate时的重要内容。 总结来说,`Session.flush()`是Hibernate中不可或缺的一部分,它确保了数据库与应用...
4. **实体状态异常**: Hibernate在操作实体时会根据其生命周期状态进行处理,如果出现“ detached entity passed to persist”之类的错误,可能是因为实体状态管理不当。确保在操作实体前正确处理其状态(如merge、...
同时,实体状态管理更加智能,可以更好地处理脏检查和变更检测,以提升整体性能。 在配置方面,4.1版本提供了更灵活的XML和基于注解的配置方式。开发者可以选择使用传统的hibernate.cfg.xml文件,或者使用@Entity...
事务管理是Hibernate的核心功能之一,它确保了数据的一致性和完整性。 ##### 2.1 定义事务 Hibernate支持多种事务定义方式,包括程序式和声明式事务。 ##### 2.2 物理事务 **2.2.1 物理事务-JDBC** 当使用JDBC...
自动脏检查是 Hibernate 的一个重要特性,它能够在事务提交时检测到对象状态的变更,并自动更新到数据库。通过设置对象为只读模式,可以阻止 Hibernate 对其进行脏检查,从而避免不必要的数据库更新。 【集合类型与...
**乐观锁**(Optimistic Lock)则相对乐观,它假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,只有在更新数据时才会检查在此期间数据是否被其他事务修改过。在Hibernate中,乐观锁通常通过版本字段...