jpa批量保存,事务没提交_在事务外自动保存托管JPA实体

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);
}

在上面的示例中,通过存储库获取了特定汽车的最新汽车租赁条目,并结束了该租赁。 然后,将创建并保存一个新的汽车租赁条目。 这在没有@Transactional情况下将起作用,因为carRentalRepository是一个处理事务的SimpleJPARepository 。 现在考虑以下在更改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

jpa批量保存,事务没提交

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

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

相关文章

sum和total的区别

文章目录一、词义辨析不一样二、词义广泛性不一样三、变形词不一样一、词义辨析不一样 1、sum指两个或更多的数目相加的总和。 例:When you add all the figures together, the sum is100. 当你把这些数字加起来,总数是100。 2、total指总量之大&…

速达服务器账套定期维护么,速达软件常见操作问题解决方法

《速达软件常见操作问题解决方法》由会员分享,可在线阅读,更多相关《速达软件常见操作问题解决方法(11页珍藏版)》请在人人文库网上搜索。1、速达软件常见操作问题解决方法,速达软件 ,1,打开客户端登陆时“你输入的数值不规范,请输入整数&…

IntelliJ IDEA for Mac在MacOS模式下的导航快捷键(Navigation Shortcut)

快捷键快捷键符号英文名称功能说明Shift Command [⇧⌘[Go to previous editor tab/Select Previous Tab向左切换打开的编辑 tab 页Shift Command ]⇧⌘[Go to next editor tab/Select Next Tab向右切换打开的编辑 tab 页F12Go back to previous tool window返回到前一个工…

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

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

IntelliJ IDEA for Mac 在MacOS模式的重构快捷键(Refactoring Shortcut)

快捷键快捷键符号英文名称功能说明F5Copy复制文件到指定目录F6Move移动文件到指定目录Command Delete⌘⌫Safe Delete安全删除ShiftF6⇧F6Rename重命名,批量修改相同引用变量的名称。例如,变量 i ,在代码中多个地方有使用到,那么…

java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

java中无法推断类型参数最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本。 该策略假定只有每个第3版都将提供长期支持或LTS。 快速说明: 具有LTS的当前版本是Java 8; Java 9仅应在2018年3月之前获得支持&#xff0…

搭建IC设计EDA虚拟机服务器,忆往昔--集成门控时钟技术的前世--分离门控时钟技术...

本文转自:自己的微信公众号《集成电路设计及EDA教程》《忆往昔--集成门控时钟技术的前世--分离门控时钟技术》多种门控时钟实现方案:Design Compiler中已经集成了可以进行低功耗设计的Power Compiler,它有多种门控时钟实现方案(分离门控时钟、…

IntelliJ IDEA for Mac 在MacOS模式下的注释快捷键(Comment Shortcut)

快捷键快捷键符号英文名称功能说明Command/⌘/Comment/uncomment with line comment单行注释Command Option /⌘⌥/Comment/uncomment with block comment块注释,多行注释Shift Control /⇧⌃/Comment/uncomment with block comment块注释,多行注释/…

云服务器的协议,云服务器协议

云服务器协议 内容精选换一换当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行CIFS类型的文件系统的挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协…

java 类名重复_更快地重复访问Java的Java类名?

java 类名重复Claes Redestad已在core-libs-dev邮件列表上发布了消息“ RRF:8187123 :(反映)Class#getCanonicalName和Class#getSimpleName是性能问题的一部分 ”,他在邮件列表中要求审查建议的…

IntelliJ IDEA for Mac在MacOS模式下的编辑快捷键(Editing Shortcut)

快捷键快捷键符号英文名称功能说明Control Space⌃SpaceBasic code completion基本的代码补全(补全任何类、方法、变量),代码智能提示,因为和切换输入法快捷键冲突,所以基本改成Alt/Shift Command Enter⌘⇧↩Compl…

网站服务器被访问 io,服务器端被客户端访问完以后出现java.io.ioexception,socket问题。...

异常为:java.io.ioexception客户端代码如下:package package1.socket;import java.net.*;import java.io.*;import java.util.*;public class C_Scoket {Socket C_S;BufferedReader br;PrintWriter pw;String receive;public static void main(String[] …

layui绑定json_认识定制:JSON绑定概述系列

layui绑定json让我们看一下自定义JSON绑定序列化和反序列化过程时 , 注释模型和运行时配置如何工作。 本系列的下一篇文章介绍JSON-B如何处理自定义对象的创建。 注释方法 使用注释方法,可以通过注释字段,JavaBean方法和类来定制默认的序列…

IntelliJ IDEA for Mac在MacOS模式下的调试快捷键(Debugging Shortcut)

快捷键快捷键符号英文名称功能说明F8F8Step Over进入下一步,如果当前行断点是一个方法,不会进入当前方法体内。逐行执行程序F7F7Step Into进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方…

jakarta ee_Jakarta EE,EE4J和Java EE之间的关系

jakarta eeJakarta EE的名称已经存在了一个多月,即使Mike Milinkovich在他的博客文章“ The Name Is…”中很好地解释了名称和概念,但对于它们之间的关系仍然有些困惑,我也提出了疑问只要有话题就可以围绕它。 我试图在这里总结一下。 希望能…

无线网服务器有辐射吗,WiFi对孕妇有辐射吗

针对无线WiFi上网产生的辐射是否会对人体有伤害已有实验研究。实验结果已经显示,现在包括由无线路由器发射的WiFi在内的无线网络频率虽然较高,但是功率都不大,对人体的辐射影响可以说微乎其微。那么对于孕妇来说,辐射也是非常小的…

IntelliJ IDEA for Mac在MacOS模式下的选择快捷键(Select Shortcut)

快捷键快捷键符号英文名称功能说明Shift Command 8按列选择模式。按下此组合键,再按鼠标左键拖动选择矩形区域,输入新的内容,可以替换被选择的所有行的内容OptionCommand↑⌥⌘↑Extend selection扩展选定范围,和系统快捷键有冲…

jvm虚拟机内存结构_JVM体系结构101:了解您的虚拟机

jvm虚拟机内存结构Java虚拟机(JVM)架构和Java字节码101的初学者速成班 Java应用程序无处不在,它们在我们的手机,平板电脑和计算机上。 在许多编程语言中,这意味着多次编译代码以使其在不同的OS上运行。 对于我们作为开…

IntelliJ IDEA for Mac在MacOS模式下的搜索/查询/查找快捷键(Search Shortcut)

文章目录根据内容查找文件根据名称查找类文件(源代码文件)根据名称查找任何类型文件查找字段名称、方法名、类名声明的地方查找所有的内容查找任何动作快捷键快捷键符号英文名称功能说明Double ShiftDouble ⇧Search everywhere查询任何东西。建议改成 S…

json解析适配模板_认识适配器:JSON绑定概述系列

json解析适配模板适配器通过实现JsonbAdapter接口来配置自定义对象的创建和序列化。 方法AdaptToJson()和AdaptFromJson()被执行序列化和反序列化操作的逻辑覆盖。 下一篇文章介绍了使用自定义序列化器和反序列化器自定义JSON-B的…