解决使用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()" 方法 添加 ...
随机推荐
- Chocolate Eating【二分】
题目链接:https://ac.nowcoder.com/acm/contest/1577/K 题目大意: 给出n块巧克力,m天吃完.每块巧克力有a[i]快乐值,每天可以选择吃任意块或者不吃巧克力(按 ...
- Shuffle 机制
1. 概述 Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle. 2. Partition 分区 需求:要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按照手 ...
- Mstering QT5 chapter1
涉及到c++ 14新特性: lambda,autovariables. A basic .pro file generally contains: 1) Qt modules used (core, ...
- time模块/datetime模块/calendar模块
time模块时间的表示形式时间戳:以整型或浮点型表示⼀个时间,该时间以秒为单位,这个时间是以1970年1⽉1⽇0时0分0秒开始计算的. 导入time import time 1.返回当前的时间戳 no ...
- MogileFS操作指令
使用mogtool来操作文件 加入文件:mogtool inject <file_name> <key_name> --trackers=192.168.1.106:7001 ...
- tomcat端口号被占用问题
1 netstat -ano| findstr 8761 2 taskkill /f/t/im 5156
- C# wsdl.exe 生成类文件
wsdl.exe D:\XXX\demand\demand.\wsdl\XXX.wsdl /\wsdl\class 在 vs tools:Developer Command Prompt For VS ...
- (九) spring 使用自定义限定符注解
案例一 定义接口 CD.java package interfacepackage; public interface CD { void play(); } 定义接口 player .java p ...
- (一)Spring框架基础
一.什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,i ...
- numix Docky
今天我们介绍这款主题适用于 Docky 启动器的 numix 主题,关于 Docky 大家已经应该很熟悉了,一款类似 Mac 底部软件停放的快捷启动码头.如图: 这款主题是 Docky 的主题,如果你 ...