论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
JPA在事务结束时自动更新查询数据
JPA在事务结束时自动更新查询数据
立聪堂德州十三局店
论坛元老
|
2023-6-20 17:50:41
|
显示全部楼层
|
阅读模式
楼主
主题
2393
|
帖子
2393
|
积分
7179
目录
现象
产生的原因
解决方法
现象
最近解决了一个困惑几天的bug,数据库里的某一些记录莫名其妙的被刷新了,排查过代码跟应用日志,可以确定不是代码执行的更新。直到今天看到了一条日志,在事务提交时报错“Column 'user_name' cannot be null”,在出错的事务中,针对这一个表只会执行query不会执行update,而这个报错信息是只有insert或者update时才有可能出现,这就意味着事务中自动在这个表执行了的insert或者update语句。
产生的原因
JPA通过EntityManager对数据库实体类进行管理,而实体对象的状态有new/managed/removed/detached四种状态,如下图所示
瞬时状态(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状态的数据对象,可以复制对象,使用副本
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
立聪堂德州十三局店
论坛元老
这个人很懒什么都没写!
楼主热帖
零信任介绍
哈夫曼应用
WPF开发随笔收录-获取软件当前目录的坑 ...
《微信小程序-基础篇》什么是组件化以 ...
【iOS逆向与安全】frida-trace入门 ...
VMware虚拟机安装Linux教程(超详细) ...
2021年7月整理--简单方法 暴力破解WIFI ...
sqlserver字符串拼接
django使用多个数据库实现
计算机等级考试二级C语言上机题集(第1 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
虚拟化与私有云
人工智能
快速回复
返回顶部
返回列表