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

Spring Mapsturct、hibernate、更新嵌套实体(行被其他事务更新或删除(或未保存值映射不正确))

Spring MapStruct、Hibernate、更新嵌套实体问题解析

基础概念

Spring MapStruct 是一个代码生成器,用于简化 Java Bean 类型之间的映射实现。它基于约定优于配置的原则,自动生成类型安全的映射代码。

Hibernate 是一个开源的对象关系映射(ORM)框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以使用面向对象的编程思维来操作数据库。

更新嵌套实体 指的是在处理数据库事务时,涉及到多个关联表的数据更新操作。

相关优势

  • Spring MapStruct 的优势在于减少了手动编写映射代码的工作量,提高了开发效率,并且生成的代码性能高、类型安全。
  • Hibernate 的优势在于它提供了强大的对象关系映射能力,简化了数据库操作,支持复杂的查询和事务管理。

类型与应用场景

  • Spring MapStruct 常用于不同层之间的数据转换,如 DTO(数据传输对象)与 Entity(实体)之间的转换。
  • Hibernate 广泛应用于需要复杂数据库交互的应用程序中,如企业级应用、电商平台等。

遇到的问题及原因

在更新嵌套实体时,可能会遇到“行被其他事务更新或删除”或“未保存值映射不正确”的问题。这些问题通常由以下原因引起:

  1. 并发事务冲突:当多个事务同时尝试修改同一行数据时,可能会发生冲突。
  2. 级联操作不当:在 Hibernate 中,如果级联设置不正确,可能会导致关联实体的状态不一致。
  3. 懒加载异常:在事务外尝试访问未初始化的代理对象时,可能会抛出懒加载异常。

解决方案

  1. 使用乐观锁:通过版本号或时间戳字段来实现乐观锁,防止并发更新冲突。
  2. 使用乐观锁:通过版本号或时间戳字段来实现乐观锁,防止并发更新冲突。
  3. 正确设置级联类型:根据业务需求合理设置 @OneToMany@ManyToOne 等注解的 cascade 属性。
  4. 正确设置级联类型:根据业务需求合理设置 @OneToMany@ManyToOne 等注解的 cascade 属性。
  5. 处理懒加载异常:确保在事务范围内访问懒加载属性,或使用 JOIN FETCH 进行预加载。
  6. 处理懒加载异常:确保在事务范围内访问懒加载属性,或使用 JOIN FETCH 进行预加载。
  7. 使用事务管理:合理配置事务边界,确保数据的一致性和完整性。
  8. 使用事务管理:合理配置事务边界,确保数据的一致性和完整性。

通过以上措施,可以有效解决更新嵌套实体时遇到的问题,保证系统的稳定性和数据的一致性。

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

相关·内容

spring事务(上)

,虚相互隔离不能相互干扰 持久性(Durability),事务一旦提交,对系统数据的变更就应该是永久的,必须被永久保存下来,即使服务器宕机了,只要数据库能够重新启动,就一定能够恢复到事务成功结束时的状态...虚读(phantom read) 一个事务执行两次查询,第二次结果集包含第一次中没有或者某些行已被删除,造成两次结果不一致,只是另一个事务在这两次查询中间插入或者删除了数据造成的 ?...以前没有Spring帮助我们完成事务的时候我们必须自己手动的控制事务,例如当我们项目中仅仅使用hibernate,而没有集成进spring的时候,我们在一个service层中调用其他的业务逻辑方法,为了保证事物必须也要把当前的...与PROPAGATIONREQUIRESNEW的区别: RequiresNew每次都创建新的独立的物理事务,而Nested只有一个物理事务; Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚...,而 RequiresNew由于都是全新的事务,所以之间是无关联的; Nested使用JDBC 3的保存点实现,即如果使用低版本驱动将导致不支持嵌套事务。

77930

加速你的Hibernate引擎(下)

Hibernate允许在两个地方定义数据抓取策略,一处是在映射元数据中,另一处是在HQL或Criteria中覆盖它。...软锁缓存;在一个事务中更新数据库;在上一个事务成功完成后更新缓存;否则释放软锁。 软锁只是一种特定的缓存值失效表述方式,在它获得新数据库值前阻止其他事务读写缓存。那些事务会转而直接读取数据库。...如果是缓存集群,“清除缓存”调用会让所有副本都失效,这通常被称为“拉(pull)”更新策略。 对于实体的删除或插入动作,或者集合变更,调用序列都是相似的。...4.9.3 DML风格 使用DML风格的插入、更新或删除,你直接在数据库中操作数据,这和前两种方法在Hibernate中操作数据的情况有所不同。...因为一个DML风格的更新或删除相当于前两种方法中的多个单独的更新或删除,所以如果更新或删除中的WHERE子句暗示了恰当的数据库索引,那么使用DML风格的操作能节省网络开销,执行得更好。

97130
  • 知识汇总(三)

    数据库设置的是什么我就用什么; ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读); ISOLATION_READ_COMMITTED...:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),sql server 的默认级别; ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致...发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。 100.说一下 spring mvc 运行流程?...116.hibernate 有几种查询方式? 三种:hql、原生 sql、条件查询 Criteria。 117.hibernate 实体类可以被定义为 final 吗?...118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。

    1.1K50

    Java面试宝典4.0版

    事务的原子性:一组事务,要么成功;要么撤回。 2 、稳定性 : 有非法数据(外键约束之类),事务撤回。 3 、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。...要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟 一标识。这个惟一属性列被称为主关键字或主键。 第二范式( 2NF )要求实体的属性完全依赖于主关键字。...所以第三范式具有如下特征: 1 ,每一列只有一个值 2 ,每一行都能区分。 3 ,每一个表都不包含其他表 已经包含的非主关键字信息。...SessionFactory 接口:初始化 Hibernate ,充当数据存储源的代{过}{滤}理,创建 Session 对象。 Session 接口:负责保存、更新、删除、加载和查询对象。...,该缓存用来存放被工作单元读过的数据,将来其他工 作单元可能会重用这些数据,因此这个缓存中的数据能够被所有工作单元共享。一个工作单 元通常对应一个数据库事务。

    1.1K40

    ORM和 Spring Data Jpa

    JPA包含的技术 ORM 映射元数据:JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。...参数可以取2个枚举值:FlushModeType.AUTO 为自动更新数据库记录,FlushMode Type.COMMIT 为直到提交事务时才更新数据库记录。...该方法调用时如果参数位置或参数名不正确,或者所赋的参数值类型不匹配,将抛出 IllegalArgumentException 异常。...select 用来指定查询返回的结果实体或实体的某些属性。 from 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。...注意: JPQL 不支持使用 INSERT 方法的返回值应该是 int,表示更新语句所影响的行数 在调用的地方必须加事务,没有事务不能正常执行 默认情况下, Spring Data 的每个方法上有事务

    3.4K30

    SpringDataJPA 系列之 JPA 简介

    ,当从数据库 SELECT 时,自动把字段的值塞进 JavaBean 的对应属性里,当做 INSERT 或 UPDATE 时,自动把 JavaBean 的属性值绑定到 SQL 语句中。...1.1.2 为什么要有 ORM   当实现一个应用程序时(不使用 ORM),我们可能会写特别的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的,一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程...Jpa:Java Persistence API 的简称,中文名 Java 持久层 API,是 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。...时创建,退出是删除表结构;  ♞ update: 加载 hibernate 自动更新数据库结构。...:是否可以插入 updateable:是否可以更新secondaryTable: 从表名columnDefinition: 定义建表时创建此列的 DDL ☞ 主键生成策略   通过注解来映射 hibernate

    4.4K20

    Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

    删除-创建-操作-再删除 update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model...类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。...没表-创建-操作 | 有表-更新没有的属性列-操作 validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...Long> { public User findByName(String name); } 继承JpaRepository之后就继承了: Repository.save(user); // 插入或保存...配置数据库引擎为InnoDB: spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect 步骤二、在方法或类上标识事务

    3.8K20

    Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

    [删除-创建-操作-再删除] update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model...类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。...[没表-创建-操作 | 有表-更新没有的属性列-操作] validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。...Long> { public User findByName(String name); } 继承JpaRepository之后就继承了: Repository.save(user); // 插入或保存...配置数据库引擎为InnoDB: spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect 步骤二、在方法或类上标识事务

    3.5K40

    Spring Data JPA的使用及开启二级缓存

    spring.jpa.hibernate.ddl-auto=update 设置 spring.jpa.hibernate.ddl-auto 属性为 create 或 update。...create 表示每次启动应用时都会删除现有表并重新创建。 update 表示每次启动应用时会根据实体类的定义,更新已存在的表结构(增加或修改列),但不会删除数据。如果表不存在也会创建。...extends T> entities) 批量删除实体对象 方法名称查询 方法名称查询是 Spring Data JPA 中最简单的一种自定义查询方法,并且不需要额外的注解或 XML 配置。...=true #开启批量更新 spring.jpa.properties.hibernate.order_updates=true 当batch_size设置值等于1的时候也是不生效的,必须大于1。...@CachePut 保证方法被调用,并缓存结果。常用于更新数据。

    1K10

    SpringBoot整合JPA+SQLite

    spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update表示根据实体类结构变化自动更新数据库表结构...定义实体类 创建对应数据库表的Java实体类,使用JPA注解标注类与属性映射关系。...,Spring Data JPA会在运行时自动生成实现类,提供如save(保存)、findById(根据主键查询)、findAll(查询所有)等常用方法。...; } } 运行上述测试方法,通过userRepository.save保存User对象到SQLite数据库,观察控制台日志确认操作成功,可进一步编写查询、更新、删除等测试用例全面验证整合后的持久化能力...后续可深入探索JPA复杂查询(使用@Query自定义SQL或方法命名规则查询)、事务管理(在业务层用@Transactional注解控制事务)、SQLite性能优化(索引优化、连接池配置适配)等方向,让基于此技术栈的应用数据处理更加高效

    18310

    Spring data 相关注解

    此篇记录大部分自己学习中用到的Spring data 注解,附带记录了一些业务中经常用到的其他注解 ---- @JsonIgnoreProperties 类注解 作用是json序列化时将Java...该注释可以应用于实体类,映射超类或回调监听器类的方法。 用于setter 如果要每次更新实体时更新实体的属性,可以使用@PreUpdate注释。...使用该注释,您不必在每次更新用户实体时显式更新相应的属性。 preUpdate不允许您更改您的实体。 您只能使用传递给事件的计算的更改集来修改原始字段值。...@PostUpdate 事件在实体的状态同步到数据库后触发,同步在事务提交时发生。...@PostUpdate事件在实体的状态同步到数据库之后触发,同步在事务提交时发生。

    2.1K20

    如何实现Java后端数据校验?看这篇就足够!

    AssertTrue 用于boolean字段,该字段只能为true DecimalMax(value) 被注释的元素必须是一个数字,只能大于或等于该值 DecimalMin(value) 被注释的元素必须是一个数字...Past 检查该字段的日期是在过去 PastOrPresent 判断日期是否是过去或现在日期 Max(value) 该字段的值只能小于或等于该值 Min(value) 该字段的值只能大于或等于该值 Negative...Validator校验框架的使用,其中,username属性,表示只有新增/保存的时候,才会校验username属性,而email属性,无论是保存或者更新的得时候都会校验email属性,如果不指定groups...顾名思义,嵌套验证就是一个实体中的属性包含其他实体,在对当前实体做校验的同时,还要对其属性的实体进行嵌套验证,比如,我们现在有一个实体CreateRoomInfoVO,通过Java+Hibernate校验...的值为6,本质上应该嵌套校验是不能通过的,原因是Spring Validation框架只会对CreateRoomInfoVO的username,mobile,identify,carProvide,driverProvide

    13.6K72

    “金三银四”招聘期又要到了,快来复习JAVA题!!

    Never 绝不 总是非事务地执行,如果存在一个活动事务,则抛出异常 Nested 嵌套的 如果有就嵌套、没有就开启事务 2.5.11 Spring事务的隔离级别 1....ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 4....删除状态(removed):对象有关联的ID,并且在Session管理下,但是已经被计划(事务提交的时候,commit())删除。...如果没有事务就不能删除 相互转换 图片13.png 2.5.15 介绍一下Hibernate的缓存? 一、why(为什么要用Hibernate缓存?)...保存数据库后,在内存中保存一份,如果更新了数据库就要同步更新。 什么样的数据适合存放到第二级缓存中?

    2.9K130

    Hibernate总结以及在面试中的一些问题.

    如果类的映射使用了代理(proxy),load()方法会返回一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库。...如果你不确定是否有匹配的行存在,应该使用 get()方法,它会立刻访问数据库,如果没有对应的行,会返回null。...为了维持两个实体类(表)的关系,而添加的一些属性,该属性可能在两个实体类(表)或者在一个独立的表里面,这个要看这双方直接的对应关系了: 这里的维护指的是当主控放进行增删改查操作时,会同时对关联关系进行对应的更新...* 一级缓存,保存Session中, 事务范围的缓存 * 二级缓存,保存SessionFactory ,进程范围的缓存 SessionFacoty 两部分缓存 内置 :Hibernate..., 更新或删除操作的时间戳.

    1.6K120

    Hibernate面试题大全

    该对象还没有被持久化【没有保存在数据库中】 不受Session的管理 ?...如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。 Hibernate二级缓存:存储的是常用的类 ?...只有Teacher插入或删除时才会触发对中间表的操作。...使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值); 使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。...4、而getCurrentSession需要我们手动设置绑定事务的机制,有三种设置方式,jdbc本地的Thread、JTA、第三种是spring提供的事务管理机制org.springframework.orm.hibernate4

    2K50

    补习系列(19)-springboot JPA + PostGreSQL

    指定为 update,这样框架会自动帮我们创建或更新表结构。...为了演示事务的使用,上面的代码指定了几个关键属性,包括: propagation 传递行为,指事务的创建或嵌套处理,默认为 REQUIRED 选项 描述 REQUIRED 使用已存在的事务,如果没有则创建一个...NESTED 创建一个事务,如果已存在事务,新事务将嵌套执行。 isolation 隔离级别,默认值为DEFAULT 级别 描述 DEFAULT 默认值,使用底层数据库的默认隔离级别。...大部分等于READ_COMMITTED READ_UNCOMMITTED 未提交读,一个事务可以读取另一个事务修改但还没有提交的数据。不能防止脏读和不可重复读。...READ_COMMITTED 已提交读,一个事务只能读取另一个事务已经提交的数据。可以防止脏读,大多数情况下的推荐值。

    2.2K70

    SpringBoot重点详解–使用JPA操作数据库

    JPA使用XML文件或注解(JDK 5.0或更高版本)来描述对象-关联表的映射关系,能够将运行期的实体对象持久化到数据库,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据。...其中,spring.jpa.hibernate.ddl-auto 参数用来配置是否开启自动更新数据库表结构,可取create、create-drop、update、validate、none五个值。...关闭时自动删除生成的数据库表结构; update 只在第一次加载hibernate时自动生成数据库表结构,以后再次加载hibernate时根据model类自动更新表结构; validate 每次加载hibernate...none 关闭自动更新 创建POJO实体 首先创建一些普通对象,用来与数据库的表建立映射关系,在此我们只定义了员工和部门两个实体来进行示例。...saveAndFlush(S entity); // 保存实体并立即提交事务 void deleteInBatch(Iterable entities); // 批量删除实体集合 void

    2.9K20

    JAVA面试锦囊(七)

    (5) 学习难度:Struts2学习成本比较高,比如拦截器、值栈及OGNL表达式,而Spring MVC相对简单。...(2) AOP面向切面的编程:我们主要使用AOP来做事务、权限判断、日志等功能,核心原理:使用动态代理的方式,在执行方法前后或出现异常后加入相关逻辑。 ● 说说Spring事务的传播特性?...不用考虑对象间一些复杂的映射关系。 (3) 由于Mybatis需要我们在xml配置文件中写sql,hibernate我们无法直接控制语句。我们就无法去写特定的高效sql或复杂sql语句。...Hibernate好处:hibernate是一个全自动的orm映射工具,他可以自动生成sql语句并执行返回java结果。 ● Hibernate对象几状态?...游离状态:已经被持久化,但没有处于session中,该状态的对象为游离对象。 删除状态:对象有关联的ID,并且在session管理下,但是已经被计划删除。

    37820
    领券