调用开启新事物A,B方法,JPA在A方法修改的数据执行完之后,又撤回的问题

此处调用两个方法

在这里插入图片描述
两个方法均添加了开启新事务注解
方法一
方法二

第一个方法中使用 JPA save()方法进行更新数据,
第二方法没有对数实体进行操作

运行整个方法未抛出异常

神器的地方在于:第一个方法,事务没有回滚,唯独数据体在方法一中更新的数据丢了

打断点查看,第一个方法执行完毕,修改同步到数据库,整体执行完毕,原有修改撤销.

因为在调用第一个方法前,数据对象已经被持久化,JPA此时会返回一个新的 managed 状态数据体,处于被托管的游离状态.

而在第一个方法填充数据之后,调用save方法. 最终调用到实体管理器的 entityManager.persist(emp)方法,而调用玩这个方法,需要调用commit()方法才能真正持久化到数据库.

总结:综上,此问题的解决方法

  • 使用实体管理器的merge(em)方法提交处理监管游离态的数据对象 (推荐)
  • 通过实体管理器创建事务管理器,进行手动提交即:
	EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
	tx.commit();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值