在事务外自动保存托管JPA实体

Spring中的存储库和事务并存。 Spring中的所有数据库访问都应在事务内运行,并且通常在某个地方使用@Transactional来强制执行此操作。 但是,这并非总是必要的。 例如,当使用Spring Data时,您的存储库使用SimpleJPARepository来实现CRUD功能。 SimpleJPARepository使用@Transactional因此在执行CRUD操作时,已经为您处理了事务。 这可能会给人以错误的印象,即您不需要使用@Transactional注释自己的类,因为仅当您知道自己在做什么时,这才是正确的。

考虑以下基于Spring Data的时间序列示例来管理汽车租赁:

public CarRentalEntry createNewRental(Car car) {CarRentalEntry latestEntry = carRentalRepository.findByCarId(car.getId());latestCarRentalEntry.setEndDate(LocalDate.now());CarRentalEntry newEntry = new CarRentalEntry();newEntry.setCarId(car.getId())newEntry.setStartDate(LocalDate.now());newEntry.setEndDate(null);carRentalRepository.save(newEntry);
}

在上面的示例中,通过存储库获取了特定汽车的最新租车条目,并结束了该租车条目。 然后,将创建并保存一个新的汽车租赁条目。 由于carRentalRepository是一个处理事务的SimpleJPARepository ,因此无需@Transactional carRentalRepository可以使用。 现在考虑在更改latestEntry的结束日期之前进行保存的以下latestEntry

public CarRentalEntry createNewRental(Car car) { CarRentalEntry newEntry = new CarRentalEntry();newEntry.setCarId(car.getId())newEntry.setStartDate(LocalDate.now());newEntry.setEndDate(null);carRentalRepository.save(newEntry);CarRentalEntry latestEntry = carRentalRepository.findByCarId(car.getId());latestCarRentalEntry.setEndDate(LocalDate.now());}

从功能上讲,该方法完全相同,但是在此示例中,将仅执行保存 。 因为没有事务,对latestEntry修改将不会保存到数据库中! 为了使这种方法有效,必须使用@Transactional注释createNewRental() 。 如果JPA受管实体上的任何更改发生在正常JPA行为的事务内,则仅将其自动保存。 因此,问题在于为什么第一种方法不需要交易。

实际上确实如此。 当latestEntry是通过存储库读取,它被加入到persistanceContext JPAS的(又名1级高速缓存) entityManager 。 当调用save()方法时,它在事务提交时刷新了persistanceContext ,这反过来又带来了副作用,即还保留了修改后的latestEntry 。 在第二个示例中, persistanceContext latestEntry在调用save()时没有latestEntry 。 因为在方法完成时没有事务提交,所以不会刷新更改。 通过添加@Transactional ,再次刷新persistanceContext ,并将修改内容写入数据库。 请注意,第二个示例也可以通过调用carRentalRepository.flush() @Transactional ,因为它也可以在@Transactional下运行。

最重要的是,您应该控制自己的事务,因为这种情况表明容易出错。

最后是调试Hibernate和受管实体问题时的提示。 放置断点的良好候选类是:

  • org.springframework.orm.jpa.JpaTransactionManager
  • org.hibernate.jpa.internal.TransactionImpl.commit()要刷新的持久性上下文通常在TransactionImpl.entityManager.session.persistenceContext找到

翻译自: https://www.javacodegeeks.com/2018/05/automatic-save-of-managed-jpa-entities-outside-of-transaction.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...

推荐学习疯狂膜拜!阿里出品Spring Security王者晋级文档肝了十天半月,献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图前言事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发&#xff0c…

wcdma系统随机接入过程的流程图_招聘电信协优初中级优化工程师、联通系统高级...

点击上方“通信人才网” 订阅!招聘岗位招聘职位: 电信协优初中级优化工程师岗位类型:5G无线网络优化,4G-LTE无线网络优化,无线网优项目负责人,DT/CQT测试与分析,2G/3G无线网络优化工作地点: 西宁市,果洛藏族自治州,海南藏族自治州…

基于wincc的虚拟电梯设计_一文带你了解西门子整个虚拟调试与仿真软硬件体系...

写在面前大家好,我是小智,智能制造之家号主~经常有朋友关注到PLCSIM、SIMIT、Amesim、NX MCD、 Process Simulate、Plant Simulation等,但都不知道它们到底做啥的~因此今天对西门子仿真与虚拟调试进行整体介绍,力求让小白也能熟悉…

jedis使用 api_通过Jedis API使用排序集

jedis使用 api在上一篇文章中,我们开始研究Jedis API和Java Redis Client。 在这篇文章中,我们将研究Sorted Set(zsets)。 Sorted Set的工作方式类似于Set,它不允许重复的值。 最大的区别是,在“排序集”中…

三星ml1660拆机图解_炫龙DD2拆机,高性能的背后是怎样的面容?

双内存插槽 如标题所说,今天为大家带来炫龙DD2的图解拆机,废话少说,直接进入主题吧!笔者对炫龙毁灭者DD2进行了简单拆解,拆解方式为打开D壳,查看散热模组和各部分硬件。炫龙毁灭者DD2延续了品牌一贯传统&am…

jwt-cli:一个用于解码JSON Web令牌(JWT令牌)的Shell库

当我开始经常需要解码JSON Web令牌时,我感到迫切需要编写允许我快速进行操作的程序。 有很多不错的选项,例如jwt.io ,但是一旦您需要执行此操作,它通常就会变得笨拙。 而且,如果您需要处理多个令牌或进一步处理输出&am…

目录页码错误未定义书签怎么解决_目录页码对不齐应该怎么办?这2种方法,工作效率大增...

在制作文档目录时,你有没有遇到下图情况:右侧页码不对齐或者左侧文本不对齐,你一般是如何处理的,与大家分享相关的2种解决办法。工作效率大增!1、目录页码不对齐该怎么办?遇到这种情况,一般是制…

三阶魔方大中小魔公式_三阶魔方的入门玩法教程|魔方玩法|魔方视频教程|魔方公式图解|--想成为魔方高手就来魔方乐园吧...

深圳魔方爱好者可以到实体店跟魔方老师学魔方了!查询店铺地址在正式开始学习魔方还原前,请进入网站的首页,抽上10分钟的时间学习一些魔方的基础知识,这样会很有利于我们下面的学习,在还原的过程中有碰到疑问可以在线和…

初步了解Redis Streams以及如何在Java中使用它们

自今年年初以来,Redis Streams已进入Redis的unstable分支,并且第一个客户端始于采用Redis Streams API。 因此,这是一个绝佳的时机,可以从客户端角度看一下Redis Streams提供的功能以及如何使用它们。 免责声明:Redis…

权限丢失_不要让任何“账户权限”问题困扰你!

在Win10系统使用中时不时被“账户权限”问题困扰?别怕,有我呢~关闭更改系统相关设置时的通知不愿被安装软件、更改Windows设置时弹出的通知所打扰时,可以搜索【UAC】(若没有搜索框,请使用【Win】【Q】快捷键调出&#…

python函数返回的元组_python – 从函数返回一个单独的元组元组

刚刚在Python中遇到了这样一些奇怪的事情,并且认为我会将其记录为一个问题,以防其他任何人试图用相同的无效搜索条件找到答案看起来像元组解包使得它不能返回长度为1的元组,如果您希望迭代返回值。虽然看起来似乎是欺骗。看到答案。>>&…

java 反射操作字段_x86上的Java最终字段没有操作?

java 反射操作字段我一直很乐于深入研究多线程编程的细节,并且尽管阅读了多年的CPU内存一致性模型,无等待和无锁算法,Java内存模型,实践中的Java并发性等知识,但我总是很喜欢。等等-我仍然会创建多线程编程错误。 总是…

卡方分布分位数_卡方检验和精确概率法及两两比较

看过许多统计教程,这篇是我最推荐的介 绍数值变量如果服从正态分布,采用均数标准差进行统计描述,采用方差分析进行组间比较,如果组间差异有统计学意义,进一步采用LSD法(也可以是其它方法)进行两两比较。如果不服从正…

arcgis渔网分割提取栅格图_【操作】ArcGIS中字段的合并、分割、提取

由于种种原因,可能涉及到要对ArcGIS属性字段进行合并、分割、提取等操作,我们可以在Excel中进行运算,然后连接到ArcGIS中,这里主要介绍下通过属性表字段计算器的操作方法。目标① 合并“名称”、“代码”字段内容到新建字段“用地…

ds排序--希尔排序_图解直接插入排序和希尔排序

前言这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 。对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 O(nlogn) 的算法还要高。然而对于大规模的…

jsf 配置_JSF Tomcat配置示例

jsf 配置JavaServer Faces (JSF)是一个Web应用程序框架,旨在简化基于Web的用户界面的开发集成。 它用于开发和构建服务器端用户界面组件,并在Web应用程序中使用它们。 JSF技术基于Model-View-Controller (MVC)架构,并且通过在页面中使用可重用…

tomcat8日志乱码_Tomcat输出日志乱码解决

请先检查一下是不是由于log4J没有指定编码方式所导致的.log4j.appender.File org.apache.log4j.DailyRollingFileAppender#重点是看一下有没有这个,如果没有则加上.#加上之后需要将之前的日志文件删除,否则有可能不会重新写入日志.log4j.appender.File.Encoding UTF-8log4j.a…

使用Datastax Java驱动程序与Cassandra进行交互

今天,我这次返回了更多的Cassandra和Java集成,重点是使用Datastax Java驱动程序,而不是我已经写了很多文章的Spring Data Cassandra。 Spring Data实际上使用了Datastax驱动程序来与Cassandra进行交互,但是在其之上还附带了一些额…

java forkjoin MySQL_Java并发fork-join框架

fork-join框架允许在几个工作进程中断某个任务,然后等待结果组合它们。 它在很大程度上利用了多处理器机器的生产能力。 以下是fork-join框架中使用的核心概念和对象。ForkFork是一个进程,其中任务将其分成可以并发执行的较小且独立的子任务。语法Sum le…

无法加载可扩展计数器_多核可扩展计数器

无法加载可扩展计数器到处都需要计数器,例如,查找应用程序的关键KPI,应用程序的负载,服务的请求总数,用于查找应用程序吞吐量的一些KPI等。 由于所有这些需求,并发复杂性也增加了,这使这个问题…