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

相关文章

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

PostgreSQL的扩展dict_int应用案例解析

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

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

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