hibernate中的脏数据
这里有个误区,很多人认为脏数据就是不用的或者没有用的数据,其实不然,所谓脏数据其实是数据对象的记录发生改变后的状态。好像比较抽象吧,先举个例子来说明:
User user = session.load(User.Class, "001");
user.getName();
//这时候user被加载出来,状态为持久态,并且假设加载出来的名称为"Ken"
user.setName("Angel");
//user对象的名字被改为了"Angel",这时候这个对象的记录就是脏数据了
//不知道为啥当初会起一个dirty(脏)的名字
现在知道什么是脏数据了吧!再来举两个例子(省略了事务):
① User user = session.load(User.Class, "001");
user.setName("Angel");
Session.save(user);
② User user2 = session.load(User.Class, "002");
Session.save(user2);
分别运行上面列子,一个执行了SQL一个没有,原因很简单,因为一个修改了属性值一个没有,当然一个执行了一个没有啦,对的,对于这个问题我们一眼就看出来了,但是hibernate却没有长眼睛啊,它怎么知道一个要执行SQL一个不执行呢?这里就引出了下面的问题,到底hibernate对于脏数据是怎么处理的,即hibernate到底是怎么识别脏数据的。
解决脏数据识别的方式主要有以下两种:
① 数据对象的监控
这种方式往往是通过拦截器实现的,通过对set方法的有效监控和拦截来通知程序此对象的数据是否被修改过,因为,往往set方法一旦被调用,就意味着值被改变过,一旦拦截器发现set被调用就会将对象的状态改为"待更新",当具体更新该对象的时候只需要检测该对象的状态是否为"待更新",如果是则执行更新操作;
② 数据版本的对比
这种方式有点像事务里的乐观锁,通过版本号来控制。同理当一个数据对象被读取后,持久层框架会自动维护的最近一次读取的版本,当执行更新等操作时,会先将提交的数据和记录的版本进行对比,如果不符则执行更新等操作。
这里hibernate使用的是第二种方法,当事务提交时它就会去比对数据版本和提交的数据是否相符,以此来判定是否执行下面的SQL操作。这里就不具体列出hibernate检索的版本比对的原程序了,有兴趣大家可以自己看看hibernate的源码,当执行到transaction.commit()的时候,会执行一个flushEveryThing()的方法,而里面的flushEntities()方法就是检索版本与提交的数据是否匹配的核心操作了。这里没有做具体的实现说明,只是想让大家了解下hibernate识别脏数据的大致原理。
<!--EndFragment-->
分享到:
相关推荐
在Hibernate中,当一个持久态对象的状态发生变化但还未被提交到数据库时,这个对象就被认为包含脏数据。 - **解决脏数据问题**:Hibernate提供了一种机制来解决脏数据的问题。当Session关闭或事务提交时,Hibernate...
Hibernate 中大量数据的更新 Hibernate 是一个流行的基于 Java 的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和...
在上述例子中,当尝试向数据库插入100,000条数据时,由于默认情况下Hibernate会将所有持久化对象保留在一级缓存中,随着数据量的增加,内存消耗也会迅速增长,最终导致内存溢出。因此,我们需要对一级缓存进行管理。...
在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以用Java对象来操作数据库记录。本教程针对初学者,将介绍如何使用Hibernate从数据库中查询并显示数据。 ...
在多数据源的场景下,Hibernate提供了灵活的数据源配置,可以在同一个应用中管理多个数据库连接。这通常通过定义不同的SessionFactory配置和DataSource实例来实现。 **MyBatis** 则是一个轻量级的ORM框架,它比...
总结,这个示例展示了如何在Spring Boot 2.0中配置多数据源,使用Hibernate作为ORM工具,以及如何在DAO层通过`HibernateDaoSupport`进行数据操作,并在业务逻辑中灵活地切换数据源。这有助于实现更复杂的数据库访问...
"spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...
Hibernate是Java领域中广泛使用的ORM框架之一。 2. **Hibernate架构**:Hibernate的核心组件包括配置文件、实体类、映射文件、Session接口、SessionFactory和Transaction。配置文件设置数据库连接信息,实体类代表...
在SSH CRM项目中,Hibernate作为持久层框架,用于管理和操作数据字典,是数据库与Java对象之间的一个桥梁。本节将深入探讨SSH CRM项目中Hibernate如何实现数据字典的高效、便捷操作。SSH架构是由Spring、Struts和...
Hibernate是Java领域中最流行的ORM框架之一,它通过元数据来定义对象和数据库表之间的映射关系,使得Java对象可以直接被存储和检索,而无需编写大量的SQL语句。 在ORM中,POJO(Plain Old Java Object)是一个简单...
《Hibernate入门:第一天笔记详解》 Hibernate,作为Java领域中著名的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作,让开发者可以更加专注于业务逻辑而不是底层的数据访问。本文将基于第一天学习...
配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...
Hibernate不仅负责将Java对象映射到关系数据库中,还能够处理应用程序中的数据持久化需求。 标题“hibernate中文参考文档”意味着该文档是一份面向中文用户的Hibernate框架的参考资料,旨在为开发者提供详细的技术...
接着,描述中的"Spring+Hibernate多数据源的整合实现demo"意味着这是一个实际操作的示例,它可能包含了一个或多个配置文件和Java代码,展示了如何在Spring Boot或者传统的Spring环境下配置和使用多数据源。...
Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本篇文章将深入探讨Hibernate的数据持久化...
Hibernate配置各种数据源 <hibernate-configuration> <!– 各属性的配置–> <!—为true表示将Hibernate发送给数据库的sql显示出来 –> ”show_sql”>true <!– SQL方言,这边设定的是MySQL –> ”dialect”>...
而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据。这篇博客主要探讨了Java数据类型如何与Hibernate的类型映射进行对应。 首先,Java的基本数据类型在...
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作,使得开发者可以使用面向对象的方式来处理数据,而无需过多关注底层SQL语句的编写。 在Hibernate中,核心概念包括...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。在实际项目开发中,有时我们可能需要对数据库中的某些字段使用自定义的...
Hibernate Shards是Hibernate框架的一个扩展,它提供了数据库分片(Sharding)的功能,帮助解决高并发、大数据量场景下的性能瓶颈。本文将深入探讨Hibernate Shards的原理、使用方法以及其在实际项目中的应用。 一...