JPA在事务结束时自动更新查询数据

这篇具有很好参考价值的文章主要介绍了JPA在事务结束时自动更新查询数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 现象
  • 产生的原因
  • 解决方法

现象

最近解决了一个困惑几天的bug,数据库里的某一些记录莫名其妙的被刷新了,排查过代码跟应用日志,可以确定不是代码执行的更新。直到今天看到了一条日志,在事务提交时报错“Column 'user_name' cannot be null”,在出错的事务中,针对这一个表只会执行query不会执行update,而这个报错信息是只有insert或者update时才有可能出现,这就意味着事务中自动在这个表执行了的insert或者update语句。

产生的原因

JPA通过EntityManager对数据库实体类进行管理,而实体对象的状态有new/managed/removed/detached四种状态,如下图所示
JPA在事务结束时自动更新查询数据

  • 瞬时状态(new/transient):
    当一个实体对象最初被创建时,它的状态是New或Transient。在这种状态下,对象还没有与EntityManager关联,并且不存在数据库中。

  • 持久/托管状态(managed):
    当实体对象通过EntityManager的persist()方法持久化到数据库时,它就变成了Managed或Persistent。如果我们更改持久状态对象的值,则在提交事务时自动与数据库同步。由EntityManager从数据库检索的实体对象也处于Managed状态。

  • 游离状态(detached):
    状态Detached表示已经与EntityManager断开连接的实体对象。对象标识符应该在数据库表中,对象不与持久化上下文相关联。当关闭hibernate会话时,实例将失去与持久性管理器的关联。我们把这些物体称为分离的。表明它们的状态不再保证与数据库同步。游离的对象可以在以后的时间点重新附加到新会话,使其以及所有修改再次持久化

  • 移除状态(removed):
    通过在活动事务中使用entitymanager的remove(),也可以将持久状态实体对象标记为要删除。然后,实体对象将其状态从Managed更改为Removed,并在提交期间从数据库中物理删除。

当数据从数据库查出来时,该数据对象处于managed状态中,管理实体对象在活动事务中被修改,该更改由所属的EntityManager检测到,并在事务提交时将更新到数据库
一旦实体对象从数据库中检索出来,它可以在内存中修改将会反映到数据库当中,如下伪代码

  EntityManager em;
  Employee employee = em.find(Employee.class, 1);

  em.getTransaction().begin();
  employee.setNickname("Ram");
  em.getTransaction().commit();

当事务提交时,实体对象在数据库中nickName将会更新为Ram,而代码中并没有调用persist()。

解决方法

避免直接修改处于managed状态的数据对象,可以复制对象,使用副本文章来源地址https://www.toymoban.com/news/detail-492114.html

到了这里,关于JPA在事务结束时自动更新查询数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【BUG事务内消息发送】事务内消息发送,事务还未结束,消息发送已被消费,查无数据怎么解决?

    在一个事务内完成插入操作,通过MQ异步通知其他微服务进行事件处理。 由于是在事务内发送,其他服务消费消息,查询数据时还不存在如何解决呢? 通过spring-tx包的TransactionSynchronizationManager事务管理器解决。 Rocketmq方法封装,通过TransactionSynchronizationManager.isSynchronizationAc

    2024年02月11日
    浏览(57)
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤

    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.htm

    2024年02月04日
    浏览(41)
  • Spring Data JPA之自动创建数据库表

    由于在项目中使用到了Spring Data JPA(Java Persistent API)进行项目开发,并且自己对JPA比较感兴趣想进行学习和了解。首先学习和了解的是JPA自动创建数据库表,通过JPA能够让软件工程师们不用再去手动创建数据表,能够减轻软件工程师们的工作量。 通过本篇博客可以实现使用

    2024年02月05日
    浏览(53)
  • JPA事务 Could not open JPA EntityManager for transaction

    使用spring-data-jpa+hibernate进行持久化,接口出现如下异常 异常原因: 前端调接口,接口业务处理完成后,会保存操作日志,业务处理有一个事务,保存日志是另一个事务,第一个事务提交后释放了Connection,但是第二个事务在开启时,用的还是已释放的Connection,事务开启失败

    2024年02月17日
    浏览(48)
  • Postman自动更新后打不开,collections接口目录突然消失

    postman明明关闭了自动更新,今天突然就打不开了,双击postman.exe没反应,去安装目录一看它自己安装了几个版本,只能换一个版本的运行程序,结果打开了。 结果打开以后collections的接口目录没了。。。由于是自己的项目,最新的接口没有做备份,找工作空间一查也没有,属

    2024年02月08日
    浏览(86)
  • Java的POI-word模板生成目录自动更新--完美解决

    目录问题: 解决word模板目录在第一次打开不更新就不显示目录问题的原因:之前是通过动态替换域代码toc的形式,生成了一段域代码放置在Word的目录行,打开的时候无法直接触发渲染和更新。 方案:通过插入-文档组件-域组件-目录和索引,将当前的模板的目录直接生成到文

    2024年02月11日
    浏览(36)
  • JPA自定义SQL查询

    关于自定义SQL查询,方法名可以随意取(遵循驼峰命名法,方法名需能一眼看出此方法的用处),不需要遵循JPA制订的规则来起方法名。 自定义SQL 是指:在方法上使用 @Query 注解,然后写sql。 @Query 注解中有两个常用的属性, value (定义sql), nativeQuery (true表示数据的sql,false表示

    2024年02月02日
    浏览(28)
  • JPA查询PostgreSQL行排序问题

    我们项目使用 Spring Boot 构建,使用 JHipster 生成业务代码,包含基础的增删改查代码 使用 PostgreSQL 作为业务数据库,使用自动生成的 JPA 构建数据更新语查询 在查询某个实体类的列表时,没有指定排序字段,查询返回按照添加顺序倒序返回,这样也符合我们的需求 在修改了某

    2024年01月18日
    浏览(41)
  • elasticsearch的查询方式和mysql数据库事务隔离级别的思考

    目录 普通分页 解除查询限制 scroll查询 search_after 官方改进 轻量级试图(pit,Point in time) 总结 项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下 等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql 这种查询方式有一个问题,需要查询

    2024年01月18日
    浏览(49)
  • JPA 如何修改 联表查询返回的Map

    记录解决两个问题: 解决方法: 不直接修改这个 Map。如果你需要对 Map 进行修改操作,你可以创建一个新的 Map,然后将原 Map 的内容复制到新 Map 中。  第二个问题就是如何创建一个空的PageMap 把数据拷贝进去了 参数描述:    创建新对象并赋值伪代码如下:

    2024年04月27日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包