解决使用JPA时对象在set属性时更新了数据库问题
https://www.jianshu.com/p/1100814ff54f
之前也遇到过一次这个问题,打印的日志中也可以看见update相关的sql语句,但当时不知道为什么会去自动更新,就用了别的方式去避免了。后来再次出现的时候,用其他方式已经无法避免,还是要找到问题真正所在,发现是将从数据库中获取到的对象去set一个属性的时候,数据库就自动去update了
问题重述

就类似上面的代码,从数据库中获取到某个对象,然后在set属性时更新了数据库,在控制台可以看到打印的相应更新的语句
问题原因
Hibernate有三种基本状态:
自由态(临时状态):直接new出来的对象,既没有被保存到数据库中,也不处于session缓存中
游离态:已经被保存到数据库中但不处于session缓存中
持久态:已经被保存到数据库中并且加入到session缓存中
上述代码中的对象是持久化状态的对象,对其进行set操作时session缓存中的数据发生了改变,数据库也会跟着进行相应的改变,所以执行了update的更新操作
问题解决

最简单也是最容易想到的方式就是重新new一个对象然后再去set属性,这个时候因为不是session中的数据,不会因为对象属性发生改变而同步到数据库中
但如果这个对象要用的到,那么在set之前可以先将其转为游离态,session中提供了几个方法:
close方法:关闭session这样这个对象肯定是游离态了,因为session已经关闭了,但是往往我们实际的开发过程中,session在后面是要用的到的,所以这个方法虽然可行,但也要分场景
clear方法:将session中的所有的对象全部清除出缓存,虽然session清除了全部的对象之后自然就会变为游离态了,但这样做不太合适
evict方法:将某一个对象清除出缓存session,这个方法是很好的实现方式,推荐使用

解决使用JPA时对象在set属性时更新了数据库问题的更多相关文章
- vue 数组中嵌套的对象添加新属性--页面更新
vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735
- java序列化对象 插入、查询、更新到数据库
java序列化对象 插入.查询.更新到数据库 : 实现代码例如以下: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...
- 44. 普通对象建一个用户方法,提交时报:失败:建立业务逻辑对象失败:业务逻辑定义更新到数据库失败:ORA-00904: "DEFVERSION": 标识符无效
LBBIZPROCESSDEFSLBHISTORYBIZPROCESSDEFSLBHISTORYMULTIWFDEFSDESIGNLBHISTORYWORKFLOWDEFSDESIGNLBMULTIW ...
- spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
2019-12-1220:34:58 spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新 未解决
- 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性
https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...
- mongodb用mongoose得到的对象不能增加属性解决
一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var produ ...
- ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示
场景 Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- 当调用对象中不存的方法、属性时,__getattr__的应用场景
一.Python中创建类和实例的调用顺序 new(cls) 创建对象前调用,如果类中没定义,会一直向父类找,直到object的 new 方法创建类.cls代表类本身 init(self) 创建类实例后 ...
- 解决ios下部分手机在input设置为readonly属性时,依然显示光标
解决ios下部分手机在input设置为readonly属性时,依然显示光标 在出现如上所说的问题是尝试给input 加上 onfocus="this.blur()" 方法 添加 ...
随机推荐
- [bzoj4665]小w的喜糖_二项式反演
小w的喜糖 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4665 数据范围:略. 题解: 二项式反演裸题. $f_{i,j}$表示,前$i$种钦 ...
- 如何查看USB是不是3.0版本
打开设备管理器 找到>便携设备 对应U盘,打开属性>查看详细信息>如果设备描述为Data Traveler 3.0 那么这就是3.0的U盘
- 5年经验Java程序员面试20天
写在前面 今天分享的是一位5年工作经验的Java工程师在帝都的面试经验总结,看看这些互联网公司都爱问些什么题,希望对大家的面试有指导意义. 从事Java开发也有5年经验了,4月初自己的开启面试经历 ...
- 方法区(关于java虚拟机内存的那些事)
<深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日21:26:05 目录 方法区 图例(方法区中都保存什么) 类型信息 类型的常量池 (即运行时常量池) ...
- 关闭iTunes自动同步
方法步骤: 仅对iTunes安装在默认路径的生效. 在「运行」里边先后输入以下两条命令: "C:\Program Files\Common Files\Apple\Apple Applica ...
- 怎样理解window.name
window.name表示当前窗口的名字, 而非网页的名字, 网页的名字需要使用: document.title; window.name一般是空的字符串, 他的作用其实是配合配合超链接和表单的tar ...
- Centos7安装gitlab11 学习笔记之备份恢复及邮箱配置
一.备份 修改配置文件 vim /etc/gitlab/gitlab.rb 默认路径为 # gitlab_rails['backup_path'] = "/var/opt/gitlab/ba ...
- 在函数作用域嵌套下使用this
var myObj = { specialFunction: function () { console.log("specialFunction."); ...
- 使用 keytool 生成安卓应用程序签名
下载 keytool jar包: 解压jar包到固定目录 如: cd /Library/Java/JavaVirtualMachines/ 进入到jar包目录: cd /Library/Java/J ...
- spring 实现事务配置的方式
spring 中常用的两种事务配置方式以及事务的传播性.隔离级别 一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2. ...