问题描述

1、开启了数据库事务

2、通过EntityManager执行查询,获得返回对象

3、代码业务逻辑处理,其中有对象set属性值的操作

4、没有执行过JPA的save方法或者update语句

5、提交数据库事务,发现数据库中对应的数据更新成了新的属性值

问题复现

@Transactional
@Override
public void selectAndFlush(String id) {
User user = crudDao.selectByPrimaryKey(id);
user.setName("testFlushNotUpdateDB");
}
Hibernate: selectuser0_.AGE as AGE8_0_, user0_.CARD as CARD9_0_, user0_.NAME as NAME10_0_, user0_.PRICE as PRICE11_0_ from USER user0_ where user0_.ID=?

Hibernate: update USER set AGE=?, CARD=?, NAME=?, PRICE=? where ID=?

可以看到在set方法之后JPA自动帮我们执行了update操作

问题原因

根本原因是因为我们在执行查询以后,查询结果对象在EntityManager上下文中进行了一级缓存,执行set方法以后缓存对象状态【持久态】,事务提交时会自动帮我们flush到数据库中,导致数据被更新,下图为一级缓存对象:

 解决方法

这里提供4中解决方法:

1、提交事务之前执行EntityManager.clear()方法,清理缓存对象

2、业务代码在不需要更新数据时避免直接对查询对象进行set操作,可以使用BeanUtils.copyProperties()方法复制对象,再进行set操作

3、使用EntityManager.evict()方法清理指定对象

4、修改JPA的FlushMode,没有测试过,理论可行,代码如下:

((Session) getEntityManager().getDelegate()).setFlushMode(FlushMode.MANUAL);

解决JPA对查询对象set属性值导致数据更新的问题的更多相关文章

  1. JQuery 操作对象的属性值

    通过JQuery去操作前台对象(div,span...)的属性是很常见的事情,本文就简单的介绍几种操作情形. 1):通过属性值去获取对象 2):用JQuery去修改对象的属性值 3):获取并修改对象的 ...

  2. jquery attr()方法 添加,修改,获取对象的属性值。

    jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...

  3. 读匿名object对象的属性值

    读匿名object对象的属性值 1.定义读object对象值的功能方法 public static class StaticClass { public static string ValueByKe ...

  4. WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)

    WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...

  5. 获取JSON对象的属性值

    1.问题背景 有一个json对象,其中有键值对,那怎样获取json对象中属性值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  6. JQuery修改对象的属性值

    JQuery修改对象的属性值 用到的便是JQuery提供的attr方法,获取属性值的基本结构为:$(obj).attr("属性名"):修改属性值的结构为:$(obj).attr(& ...

  7. eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?

    eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...

  8. webdriver高级应用- 改变一个页面对象的属性值

    适用于一些无法操作的元素,可以直接改他的属性从而操作,代码如下: #encoding=utf-8 from selenium import webdriver import unittest impo ...

  9. spring:为javabean的集合对象注入属性值

    spring:为JavaBean的集合对象注入属性值 在 spring 中可以对List.Set.Map 等集合进行配置,不过根据集合类型的不同,需要使用不同的标签配置对应相应的集合. 1.创建 Ts ...

  10. 使用java中的反射获得object对象的属性值

    知识点:使用java中的反射获得object对象的属性值 一:场景 这两天开发代码时,调用别人的后台接口,返回值为Object对象(json形式的),我想获得object中指定的属性值,没有对应的ge ...

随机推荐

  1. 监控keepalived_vip控制容器的状态

    需求:监控server服务器的vip状态,如果vip存在,则判断容器是否启动,如果没有启动,则启动容器.如果vip不存在则关闭容器. 方法一: 查看代码 #!/bin/bash ip add | gr ...

  2. AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成

    写在前面的话 近期在小红书发现了许多极其可爱.美观的萌宠图片,对这些美妙的图像深深着迷 于是想着看看利用AI绘画StableDiffusion以下简称(SD)做出来. 以下是详细实操的全过程,包括所有 ...

  3. 《Kali渗透基础》13. 无线渗透(三)

    @ 目录 1:无线通信过程 1.1:Open 认证 1.2:PSK 认证 1.3:关联请求 2:加密 2.1:Open 无加密网络 2.2:WEP 加密系统 2.3:WPA 安全系统 2.3.1:WP ...

  4. 重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!

    引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face! Falcon 180B ...

  5. 正则表达式快速入门一:正则表达式(regex)基本语法及概念

    Regex quickstart :正则表达式快速入门 author: wclsn reference quick start 如果想要了解正则表达式的基本概念且英文ok的话,完全可以从我上面所附网站 ...

  6. 利用SPI实现全自动化——LCD屏与RGB灯

    如果你开启了广告屏蔽,请将博客园加入白名单,帮助博客园渡过难关,谢谢! 前言 在21年做物理实验和23年客串电赛之后,我带着STM32重回电子DIY界.这次的项目是一个电池供电的补光灯,由于用途更偏向 ...

  7. stat函数详解

    Linux系统函数之文件系统管理 stat函数 作用:获取文件信息 include <sys/types.h> #include <sys/stat.h> #include & ...

  8. DHCP和PXE是怎么工作的

    dhcp(Dynamic Host Configuration Protocol):配置一段共享IP地址,为新上线的机器分配IP地址,回收下线机器的IP地址. 正常情况下主机(DHCP client) ...

  9. 21.3 Python 使用DPKT分析数据包

    dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作.它可以处理多种协议,例如TCP.UDP.IP等,并提供了一些常用的网络操作功能,例如计算校验和.解析DNS数据包等.由于其简单易 ...

  10. 计算机的数值转化与网络的IP地址分类与地址划分

    数值转换 数字系统由来 远古时代是没有数字系统非位置化数字系统: 罗马数字 (I-1.II-2.III-3.IV-4.V-5.VI-6.VII-7.VIII-8.IX-9.X-10) 位置话数字化系统 ...