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

在事务外自动保存托管JPA实体相关推荐

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

    jpa批量保存,事务没提交 Spring中的存储库和事务并存. Spring中的所有数据库访问都应在事务内运行,并且通常在某个地方使用@Transactional来强制执行此操作. 但是,这并不总是必 ...

  2. JPA 中对象 set 属性时自动保存

    // 查出对象,原来的 name 为 user1 User user = userManager.findOne(1); // 将userName 设置为 user2 ,用于前端显示,并没有保存 us ...

  3. Spring Boot JPA实体类idea自动生成 其一-https://www.jianshu.com/p/44bb7e25f5c7

    Spring Boot JPA实体类idea自动生成 其一 marioplus12 2018.09.17 19:29* 字数 138 阅读 762评论 0喜欢 2 view -> Tool Wi ...

  4. php外链图片转换,解决zblogPHP远程外链图片自动保存的办法

    使用zblogphp版的独立博客博主们可能没有在意,zblogphp存在一个小bug就是在博客没有启用远程图片附件自动保存到本地的情况下,编辑文章中使用的外链图片依然会被自动保存到本地(在附件管理中可 ...

  5. jpa 定义中间表实体_Spring Data JPA实体详解

    1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...

  6. 使用 JPQL 和原生 SQL 查询 JPA 实体(转)

    使用 JPQL 和原生 SQL 查询 JPA 实体(转) 博客分类: EJB3.JPA及其相关 SQL JPA 企业应用 数据结构 C#  作者:Yuli Vasiliev 了解如何利用 Java 持 ...

  7. Hibernate 中对象 set 属性时自动保存入库的问题

    背景 在某个项目中,通过 Heibernate 查出某个对象后,对属性进行了 set 操作,并没有进行 update 操作,但是在数据中自动保存了. 显然这并不是我想要的,我只是想 set 一下属性, ...

  8. jpa 实体映射视图_JPA教程:实体映射-第3部分

    jpa 实体映射视图 在上一篇文章中,我展示了两种读取/写入持久实体状态的不同方法-字段和属性. 使用字段访问模式时,JPA使用反射直接从实体的字段读取状态值. 如果我们没有明确指定列名,它将直接将字 ...

  9. jpa 实体映射视图_JPA教程:映射实体–第1部分

    jpa 实体映射视图 在本文中,我将讨论JPA中的实体映射过程. 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 . 在前两篇文章中,我解释了如何在Java SE环境中设置JPA. ...

最新文章

  1. JQuery UI 1.8.13发布看看有哪些变动
  2. spaugment--生成最小二乘增广矩阵
  3. php+imagick详解,PHP中imagick函数的中文解释_php技巧
  4. vnc远程桌面复制文件Linux,vncviewer远程桌面linux
  5. mysql设置定位慢查询_mysql优化——定位慢查询
  6. 具有内部类构造函数参数的Java Reflection奇数
  7. Linux下串口通信详解
  8. leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)
  9. Python中的相对文件路径的调用
  10. python的itertools库_Python标准库itertools模块使用方法
  11. 基于C++的顺序表的实现
  12. IIS出现server application error的解决办法
  13. 云计算时代,观测产品Sunfire的成长史
  14. PHP之安装Pear
  15. 腾达ac5第三方固件_腾达AC9的刷固件指南
  16. 微信公众号文章素材收集网站大盘点
  17. css空心三角形_CSS实现空心三角指示箭头
  18. Python 跨文件调用函数 + 在一个文件中执行另一个文件
  19. 《思维力:高效的系统思维》读书笔记05 - 快速提升你的沟通表达能力
  20. 2018 ucla计算机排名,2018福布斯最具价值美国大学排名:加州UCLA位列榜首!

热门文章

  1. CERC2017 Gambling Guide,最短路变形,期望dp
  2. 洛谷P2501数字序列 动态规划
  3. Hadoop入门(二十四)Mapreduce的求TopK程序
  4. java并发编程之4——Java锁分解锁分段技术
  5. Java基于socket服务实现UDP协议的方法
  6. HTML中常用知识点整理
  7. 定了!对于本周四(7.16日)抽奖活动取消简要说明,新抽奖活动暂定下周三(7.22日)...
  8. 2017最新顺口溜出炉(超级经典)!
  9. 方舟非主机服务器无限距离,方舟非专业服务器距离限制怎么解除 | 手游网游页游攻略大全...
  10. kafka消费者开发方式小结