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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四