首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在hibernate中,为什么将同一个实体对象保存两次不起作用

在Hibernate中,将同一个实体对象保存两次不起作用的原因是因为Hibernate的一级缓存机制。

Hibernate使用一级缓存来提高性能,避免频繁地与数据库进行交互。一级缓存是指Hibernate在同一个Session中对实体对象进行缓存,以便在后续的操作中能够快速访问和更新这些对象。

当我们保存一个实体对象时,Hibernate会将该对象添加到一级缓存中。如果我们再次保存同一个实体对象,Hibernate会检查一级缓存中是否已经存在该对象。如果存在,则不会再次执行数据库操作,而是直接返回缓存中的对象。

这种机制可以有效地避免重复保存相同的实体对象,提高了性能和效率。同时,一级缓存还能够保证数据的一致性,避免脏数据的产生。

然而,如果我们在同一个Session中将同一个实体对象保存两次,由于一级缓存的存在,第二次保存操作不会触发数据库操作,也不会更新缓存中的对象。因此,第二次保存操作对数据库没有任何影响。

如果我们需要保存两个相同的实体对象,可以通过创建两个不同的实体对象来实现,或者在保存第一个实体对象后,手动清除一级缓存中的对象,再保存第二个实体对象。

总结起来,将同一个实体对象保存两次不起作用是因为Hibernate的一级缓存机制,通过检查缓存中是否已存在该对象来避免重复保存和数据库操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hibernate 的延迟加载(懒加载)简介1

什么是延迟加载: 使用某些Hibernate方法查询数据时,Hibernate返回的只是一个对象(除id外属性都为null),并没有真正查询数据库。...---- 为什么要使用延迟加载: 可以提升内存资源的使用率 可以降低对数据库的访问次数 ---- 采用延迟加载的方法: session.load() 查询时不进行SQL查询,使用对象时才执行SQL...查询;效率高 query.iterate() 查询时只查询了ID,而只有使用对象时才会查询对象的完整信息,每用一个对象查询一次,增加了查询次数;效率低 关联映射中对关联属性的加载 one-to-one...连接查询,lazy属性就不起作用 ---- 使用延迟加载需要注意的问题 采用具有延迟加载机制的操作,需要避免Session提前关闭,避免使用对象之前关闭session。...采用延迟加载方法,返回的对象类型是Hibernate采用CGLIB技术在内存动态生成的类型,该类型是原实体类的子类,并在子类重写了属性的get方法。

1.4K20
  • Hibernate配置文件详解-2

    1.inverse 具体业务场景,Customer和Orders是一对多关系,一个Customer对应多个Orders,实体类中用一个set集合作为属性来表示对应的Orders。...> 同理Orders实体类中用一个Customer类型的属性来表示对应的Customer对象。...同时多了2条修改操作,再一次将customer的id值赋给cid字段,这2条SQL语句是重复设置已经建立的主外键约束关系。 为什么会出现这种情况?...因为当前Customer和Orders对象都在维护关系,所以会重复建立两次主外键约束。 如何避免这种情况的出现呢? 第一种方式:Java代码中去掉一方维护关系的代码。...采用这种方式,我们不需要在逻辑代码手动删除级联对象Hibernate框架会自动帮我们删除这些对象

    60520

    Java面试题 - 03前言:三、框架篇:

    答:ORM 指的是对象关系映射(Object RelationShip Mapping ),指的就是实体对象和数据库的表关系进行一一对应,实现通过操作实体对象来更改数据库里边的数据信息。...这就是对象关系映射。hibernate框架也是一个orm框架,主要是通过主配置文件和实体类对应的映射配置文件来实现对象关系映射。 6. 你知道hibernate的懒加载吗?...所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=”false”或默认时,会导致中间表插入两次关系。 9....,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例多个线程共享; Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的...答:redis是使用C语言编写的典型的NoSQL数据库,它是一个key-value存储系统,数据存储在内存,所以存取速度非常快。 2. 为什么redis要把数据放到内存

    1K10

    Mybatis缓存相关的知识

    将用户经常查询的数据放在缓存(内存),用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询, 从缓存查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存?...测试一个Session查询两次相同的记录 查看日志输出 缓存失效的情况: 查询不同的东西 增删改操作,可能会改变原来的数据,所以必定会刷新缓存! 查询不同的Mapper.xml 手动清理缓存!...自定义缓存-encache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate默认的CacheProvider。 要在程序中使用ehcache,先要导包!...eternal:对象是否永久有效,一但设置了,timeout将不起作用。...overflowToDisk:是否保存到磁盘,当系统当机时 timeToIdleSeconds:设置对象失效前的允许闲置时间(单位:秒)。

    55030

    Java 最常见的 208 道面试题:第十二模块答案

    对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存对象之间存在关联和继承关系,而在数据库,关系数据无法直接表达多对多关联和继承关系。...不过,如果你的持久化类实现了一个接口而且该接口中声明了所有定义于实体的所有public的方法轮到话,你就能够避免出现前面所说的不利后果。 118....Hibernate,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件设置其...保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。 什么样的数据适合存放到第二级缓存?...124. hibernate 实体类必须要有无参构造函数吗?为什么

    71230

    一篇文章让你马上入门Hibernate

    Hibernate一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行...ORM:对象关系映射,是一种程序技术,简单来说就是把我们程序实体类和数据库表建立起来对应关系。 那为什么要有对象关系映射呢?...假设一下,当你开发一个应用程序的时候,你可能会写不少数据访问层的代码,用来从数据库保存、删除、读取对象信息等等。...你DAO写了很多的方法来读取对象数据,改变状态对象等等任务,而这些代码很多都是重复的。...对象映射关系赋予了程序一种强大的能力,让开发者仅仅掌握面向对象的思维来操作数据库,即在关系型数据库和业务实体对象之间作一个映射,这样,我们具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道

    29310

    Hibernate的缓存机制

    iterator的原因是,有可能会在一个session查询两次数据,如果使用list每一次都会把所有的对象查询上来 * 而是要iterator仅仅只会查询id,此时所有的对象已经存储一级缓存...我们考虑这样一种情况,如果我们需要在一个session当中要两次查询出很多对象,此时我们如果写两条 list()时,hibernate此时会发出两条 sql 语句,而且这两条语句是一样的,但是我们如果第一条语句使用...,因为第一条语句已经将对象都查询出来了,此时会将对象保存到session的一级缓存中去,所以再次查询时,就会首先去缓存查找,如果找到,则不发sql语句了。...2.hibernate.cfg.xml配置文件配置我们二级缓存的一些属性:      <!...我们看到,当我们将二级缓存注释掉以后,使用查询缓存时,也会出现 N+1 的问题,为什么呢?

    1.7K40

    Java面试题系列之技术框架部分(一)——每天学5个知识

    返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。...网络配图 Hibernate一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己xml配置文件写sql语句,hibernate要比ibatis功能负责和强大很多。...(2)、为了关机和内存空间不够的状况下,保持程序的运行状态,需要将内存对象状态保存到持久化设备和从持久化设备恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。...使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。...(5)、使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件需要登记每个

    99780

    Hibernate 一级缓存

    一级缓存的工作原理如下:当使用Session的get()或load()方法查询实体对象时,Hibernate会首先检查一级缓存是否已存在相应的对象。如果存在,则直接返回缓存对象。...一个Session,对于相同的查询操作,Hibernate会直接从一级缓存获取结果,而不再去执行数据库查询。一级缓存的生命周期与Session的生命周期一致。...使用一级缓存时,需要遵循以下几点:同一个Session的相同查询操作只执行一次数据库查询,后续直接从缓存获取结果。...一个Session,对于已经加载的实体对象,对其进行修改后,会自动同步到一级缓存。如果需要清除一级缓存对象,可以调用Session的clear()方法。...Session,我们使用get()方法查询了id为1的用户对象,执行了两次相同的查询操作。由于一级缓存的存在,第二次查询直接从缓存获取了结果,而不再去执行数据库查询。

    36720

    码云推荐 | Java 持久层工具 jSqlBox

    2为什么要开发jSqlBox?...XML 和模板语言不起作用,一旦数据库字段变动,将不得不手工检查和修改大量 SQL,这是一个繁重且可能出错的工作。)...虽然号称无侵入的轻量级框架,但 HQL 和实体管理容器本身就是一种入侵,采用了这种架构的项目就绑死实体容器这种复杂的工具上了。...jSqlBox 虽然最初目的是给 Hibernate一个动态配置,但考虑到实体容器开发及使用的复杂性,以及个人水平有限,借鉴了 MyBatis 的做法,即在运行期如需用到 OR 映射时,程序动态配置并完成...实体映射比较简单,只限于将数据集内容装配成对象树,不支持多重嵌套映射和懒加载,需要懒加载的场合须由用户自行在程序手工实现。或利用 jSqlBox 的无绑定关联来从根本上避免懒加载需求的出现。

    2K70

    Hibernate学习笔记2

    持久化类三种状态切换 3.Hibernate一级缓存 3.1. 示例---演示一级缓存的存在 3.2. 持久化对象具有自动更新数据库能力 为什么持久化对象具有自动更新数据库能力? 3.3....Hibernate关联映射-一对多 5.1. 实体类创建 5.2. Hbm映射文件编写 5.3. 测试保存 5.4. 测试单向关联保存 5.5. 双向关联维护 5.6. 对象导航 5.7....当我们通过hibernate的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session,当下一次去查询缓存具有的对象(OID值来判断...4.Hibernate关联映射-数据对象三种关系介绍 Hibernate框架基于ORM设计思想,它将关系型数据库的表与我们java的类进行映射,一个对象就对应着表的一条记录,而表的字段对应着类的属性...这个异常代表提一个持久化对象关联了一个瞬时对象。 我们可以使用级联操作来解决上述的问题. 我们现在要做的是保存订单时保存客户,需要在订单的hbm配置文件修改 ?

    1.4K40

    高级教程-springData-JPA第一天【悟空教程】

    面向对象的软件开发,通过 ORM,就可以把对象映射到关系型数据库。...1.1 为什么使用 ORM 当实现一个应用程序时(不使用 O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的。...第3章 JPA 的入门案例 3.1 需求介绍 本章节我们是实现的功能是保存一个客户到数据库的客户表。... 第三步:实体类上使用注解建立与数据库表的映射 和 jpa 的配置相同,可以直接沿用 jpa 实体类配置...没有事务的情况下: save 会去数据库 保存hibernate 提供了 一个内置的事务来 执 行。 persist 什么都不会 做。

    4.3K30

    SpringDataJPA 系列之 JPA 简介

    对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存对象之间存在关联和继承关系,而在数据库,关系数据无法直接表达多对多关联和继承关系。...1.1.2 为什么要有 ORM   当实现一个应用程序时(不使用 ORM),我们可能会写特别的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的,一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程...Hibernate一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 ORM 框架,hibernate 可以自动生成...,并将运行期的实体对象持久化到数据库。...通过输出的日志可以发现,JPA 会先将与实体类同名的表删除,然后依据实体类创建一个表,接着将数据插入新创建的表。这是怎么回事,那不是数据库永远只有一条数据?

    4.3K20

    走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

    为什么要使用Hibernate? 既然Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC的数据持久层->在编写程序的DAO层......Session是Hibernate最重要的对象,Session维护了一个连接(Connection),只要使用Hibernate操作数据库,都需要用到Session对象 通常我们DAO层中都会有以下的方法...接着src目录下创建一个cn.itheima.domain包,并在该包下创建一个Book实体类,由于Book实体写有注解配置,所以就不用编写那个映射配置文件啦!...如何设定类的属性不在表映射? 这两个问题我们一起解决。废话不多说,直接上例子。cn.itheima.domain包下再编写一个Person实体类,同样使用注解配置。...原因是我们Customer类配置了mappedBy=”c”,它代表的是外键的维护由Order方来维护,而Customer不维护,这时你保存客户时,级联保存订单,是可以的,但是不能维护外键,所以,我们必须在代码添加订单与客户之间的关系

    1.8K00

    Hibernate 脏数据检查

    这里就存在一个问题,Hibernate如何来判断一个实体对象的状态前后是否发生了变化。也就是说Hibernate是如何检查出一个数据已经变脏了。...B、数据版本比对: 这种方法是持久化框架中保存数据对象的最近读取版本,当提交数据时将提交的数据与这个保存的版本进行比对,如果发现发生了变化则将其同步跟新到数据库。...Hibernate是采用数据版本比对的方法来进行脏数据检查的,我们结合下面的代码来讲解Hibernate的具体实现策略。...此时需要Hibernate能根据当前对象的状态来判断是否要将级联对象保存到数据库。此时,Hibernate会根据unsaved-value进行判断。...Hibernate将首先取出目标对象的ID,然后将ID与unsaved-value值进行比较,如果相等,则认为实体对象尚未保存,进而马上将进行保存,否则,则认为实体对象已经保存,而无须再次进行保存

    1.4K60
    领券