SpringData JPA save和saveAndFlush方法 以及实际应用的几个问题

2024-01-31 23:08

本文主要是介绍SpringData JPA save和saveAndFlush方法 以及实际应用的几个问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

  最近的工作持久层是用spirngData JPA 来做的

  这篇文章主要解决两个问题,第一个是save方法,如果是更新操作,会丢失之前原来已经有的字段的值。第二个问题是使用save方法并不能拿到我们想要的id 的问题。

 

 # # 首先一个常用的方法 save方法

  这个方法可以更新,也可以插入一条数据,但是在使用前我们要搞明白 save 的具体的工作机制。

  具体机制:

  • 使用save方法的时候,如果数据库中没有这条数据,是根据主键进行插入一条数据的操作。
  • 使用save方法的时候,如果数据库中已经存在这条数据的时候,是进行更新操作。这里有一个疑问,到底是直接覆盖原来已有的字段,但是只更新发生改变的字段?
  • 使用save方法的时候,需要注意到返回值的问题,返回值就是一个保存的对象,但是如果想要从这个返回值中获取一个ID ,这是做不到的。疑问又来了,不是插入,并返回插入这个对象吗,怎么就没有这个id呢。 这个问题在下边解决。

  使用save方法的问题,在save更新的时候,发生改变的会更新,没发生改变的会置为空。这句话的准确性,我保留疑问,具体    我还没有去测试,具体等我测试完,这块再改。 我看到这句话是从这篇文章上:                https://blog.csdn.net/weixin_38809962/article/details/81478635

   上边标注出来的问题我又看了好几个文章,这个问题是一定存在的。对于这个问题再看一下下边的文章。

  https://segmentfault.com/q/1010000010552860/a-1020000010567065

  从文章中我们知道,其实save方法,就是直接保存一个对象,这个操作是覆盖(我说的是在这个ID已经存在的情况下,否则及就是一个插入操作,没有任何疑问)举个例子,假如这个数据库已经有此ID 的数据,并且这条数据有十个字段。其中五个字段一已经有值了。现在要save操作,但是现在恰恰要保存没有值的这几个字段,我们直接用save,发现了这样的问题,本来有值的几个字段没有了。这不是我们想要的结果。真的想要达到我们想要的结果,应该先查询一次,如果有就将查到的合并到要save 的实体类中去。这样才能做到,十个字段全有值,不丢失已经有的字段。

# #   解决从返回值中拿不到 ID 的问题,应该先来区分一下 save方法 和 saveAndFlush 方法

   下边这块内容,参考https://blog.csdn.net/NathanniuBee/article/details/90482101

  On saveAndFlush, changes will be flushed to DB immediately in this command. With save, this is not necessarily true, and might stay just in memory, until flush or commit commands are issued.

   在saveAndFlush上,此命令中的更改将立即刷新到DB。使用save,就不一定了,它可能只暂时保留在内存中,直到发出flush或commit命令。

    这就是问题的根源,为什么拿不到 ID

  But be aware, that even if you flush the changes in transaction and do not commit them, the changes still won’t be visible to the outside transactions until the commit in this transaction.

  但是要注意的是,即使在事务中刷新了更改并且未提交它们,这些更改对于外部事务仍然不可见,直到,提交这个事务。

  In your case, you probably use some sort of transactions mechanism, which issues commit command for you if everything works out fine.

在您的情况下,您可能使用某种事务机制,如果一切正常,它会为您发出commit命令。

 # # 经验:

  比如在我们得项目中,保存一条数据后,我又想立马用到这条数据得id,因为实体类是配置了uuid自动生成,所以使用saveAndFlush()方法就可以立即获取到这条数据得id。但是如果用sava()方法,你不flush()或者commit,你得数据是暂时只在内存中保存,所以此时这条数据是没有主键id的.

提交事务后数据插入进数据库,要想在事务提交之前避免缓存插入数据库需要在执行完save操作调用flush方法或者直接执行saveAndFlush方法即可

这篇关于SpringData JPA save和saveAndFlush方法 以及实际应用的几个问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665349

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施: