此处调用两个方法
两个方法均添加了开启新事务注解
第一个方法中使用 JPA save()方法进行更新数据,
第二方法没有对数实体进行操作
运行整个方法未抛出异常
神器的地方在于:第一个方法,事务没有回滚,唯独数据体在方法一中更新的数据丢了
打断点查看,第一个方法执行完毕,修改同步到数据库,整体执行完毕,原有修改撤销.
因为在调用第一个方法前,数据对象已经被持久化,JPA此时会返回一个新的 managed 状态数据体,处于被托管的游离状态.
而在第一个方法填充数据之后,调用save方法. 最终调用到实体管理器的 entityManager.persist(emp)方法,而调用玩这个方法,需要调用commit()方法才能真正持久化到数据库.
总结:综上,此问题的解决方法
- 使用实体管理器的merge(em)方法提交处理监管游离态的数据对象 (推荐)
- 通过实体管理器创建事务管理器,进行手动提交即:
EntityManager em = factory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.commit();