摘要:使用Spring Data JPA获取的对象,其属性变更后自动更新数据库问题排查与解决方案。

§问题描述

  使用继承了JpaRepository的Dao从数据库中获取到某个对象,然后操作这个对象的set属性时,新值直接更新到了数据库。例如,UserDao继承了JpaRepository,从数据库查询出一个User类实例user,当对user执行

user.setAddress("楼兰胡杨门牌号是--" + UUID.randomUUID().toString());

新值会直接更新到数据库。

§问题分析

  后来专门重现了这个问题,发现事务结束时会把属性发生改变的user对象更新到数据库,在控制台打印的日志中也可以看见相关update sql语句。百思不得其解,为什么从数据库中获取到的对象属性发生变更的时候,数据库就自动执行更新操作呢?原来是JPA的自带特性在作怪:Hibernate对象有四种状态,【持久态对象的属性被修改后,在数据库事务提交的时候,会更新数据库。】

§问题解决

  因持久层框架JPA自身的机制,会在事务提交后将持久状态的对象自动更新到数据库,所以,为了避免自动更新,我们可以创建一个对象,设置好属性后再调用save方法更新数据。

  自动更新的好处:如果某个持久状态的对象的确需要更新属性,那么,使用JPA就可以不用手动调用save方法,事务提交后自动更新到数据库,神奇吧?

§阐述实体对象的四种状态以及转换关系

  Spring Data JPA 可以理解为 是对JPA 规范的二次封装和抽象,底层还是使用了 Hibernate 的 JPA 技术实现。因此,还是要不辞劳苦地翻阅Hibernate文档。最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient)、持久态(managed, or persistent)、游状态(detached)和移除态(removed,以前Hibernate文档中定义的三种状态中没有移除态),如下图所示,就以前的Hibernate文档中移除态被视为是瞬时态。

  1. 瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。
  2. 持久态:持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。
  3. 游离态:当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。

§小结

  以上就是这篇文章关于Spring Data JPA中对象属性改变自动更新数据库的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有疑问请留言交流。Wiener在此祝各位生活愉快!工作顺利!

§Reference

转-Spring Data JPA中对象属性自动更新数据库的更多相关文章

  1. 在Spring Data JPA 中使用Update Query更新实体类

    对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...

  2. Spring data JPA中使用Specifications动态构建查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

  3. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  4. 【hql】spring data jpa中 @Query使用hql查询 问题

    spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...

  5. Spring Data JPA 自定义对象接收查询结果集

    Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...

  6. 如何在Spring Data JPA中引入Querydsl

    一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入 ...

  7. Spring data jpa中Query和@Query分别返回map结果集

    引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...

  8. Spring Data JPA中CrudRepository与JpaRepository的不同

    使用Spring Data JPA CrudRepository 和JpaRepository 的好处: 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spr ...

  9. Spring Data JPA的Audit功能,审计数据库的变更

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 数据库审计 数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便. ...

  10. Spring Data JPA 中常用注解

    一.java对象与数据库字段转化 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 2.@Table:设置实体类在数据库所对应的表名 3.@Id:标识类里所在变量为主 ...

随机推荐

  1. sql sever查询库中每个表是否存在某个列名 列出表名

    select t.TABLE_NAME from information_schema.columns t where t.COLUMN_NAME='列名';

  2. 全面的C#/.NET/.NET Core面试宝典(永久免费)

    前言 C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺.扩充知识面和大家共同学习.携手进步. 该知识库主要由自己平时学习和工作实践总结.网上优秀文章资料 ...

  3. Qt Qss 设置QPushButton图标和背景

    文章目录 Qt QSS 设置 QPushButton的图标叠加背景 前言 解决方法 background-repeat.background-position 最终样式 Qt QSS 设置 QPush ...

  4. go gin Next()方法

    示例 gin Next()使用方法 package main import ( "fmt" "github.com/gin-gonic/gin" "n ...

  5. 高德地图api标记点和线段重合点击响应问题

    问题现象: 现在地图上放置了line和marker,marker在line的上层显示 这时line和marker同时存在,当line和marker有重合部分并点击重合点时,只响应line对应的clic ...

  6. halcon 入门教程(五) 缺陷检测

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18785484 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 本篇主要讲一些 ...

  7. Draw.io:你可能不知道的「白嫖级」图表绘制神器

    介绍 draw.io 是一个在 GitHub 上开源且拥有近十年发展历史的成熟项目,它是一款用于绘制 UML 图表的工具. 如果你曾经为流程图的绘制而流泪,又或是在夜里和UML大战到失眠, 不妨试试它 ...

  8. RMQ 和 LCA 问题

    # Part 1 RMQ RMQ,即区间信息维护问题 如最大值,最小值,GCD 等 RMQ 算法实现很多 具体有线段树,树状数组和 ST 表 但综合时间复杂度最好的是 ST 表 查询 O(1),预处理 ...

  9. StringBuilder案例

    1.案例一 如图 这里无法使用反转方法的原因是,s属于String类型,而反转的方法存在于StringBuilder类型,所以我们要将s的类型转换为StringBuilder String--> ...

  10. AspNetCore MVC 跨域

    通过XMLHttpRequest或者ajax去请求一个AspNetCore API接口服务时,Firefox提示我 已拦截跨源请求:同源策略禁止读取位于 http://localhost:33694/ ...