最近解决了一个困惑几天的bug,数据库里的某一些记录莫名其妙的被刷新了,排查过代码跟应用日志,可以确定不是代码执行的更新。直到今天看到了一条日志,在事务提交时报错“Column 'user_name' cannot be null”,在出错的事务中,针对这一个表只会执行query不会执行update,而这个报错信息是只有insert或者update时才有可能出现,这就意味着事务中自动在这个表执行了的insert或者update语句。
JPA通过EntityManager对数据库实体类进行管理,而实体对象的状态有new/managed/removed/detached四种状态,如下图所示
当数据从数据库查出来时,该数据对象处于managed状态中,管理实体对象在活动事务中被修改,该更改由所属的EntityManager检测到,并在事务提交时将更新到数据库
一旦实体对象从数据库中检索出来,它可以在内存中修改将会反映到数据库当中,如下伪代码
EntityManager em;
Employee employee = em.find(Employee.class, 1);
em.getTransaction().begin();
employee.setNickname("Ram");
em.getTransaction().commit();
当事务提交时,实体对象在数据库中nickName将会更新为Ram,而代码中并没有调用persist()。
避免直接修改处于managed状态的数据对象,可以复制对象,使用副本
本文来自博客园,作者:IAyue,转载请注明原文链接:https://www.cnblogs.com/zmj-pr/p/16033530.html
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/zmj-pr/p/16033530.html
内容来源于网络,如有侵权,请联系作者删除!