You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单事务中Hibernate merge后调用refresh获旧值,此行为是否正常?

Hibernate单事务中merge与refresh行为分析

先修正你代码里的几个明显问题:

  • 实体实例化应该是 new Note("Initial Description")(你的类是Note,不是InitialNote),且Note类需要对应构造方法
  • merge是Session的方法,不是实体类方法,正确调用是session.merge(initialNote),不是initialNote.merge(...)
  • 变量笔误:session.persist(initialNode)应为session.persist(initialNote)

基于修正后的逻辑,你的测试结果完全符合Hibernate的预期行为,原因如下:

关键概念解析

  • persist执行后:initialNote成为持久态对象,它和Hibernate持久化上下文绑定,属性修改会在事务提交前通过脏检查自动同步到数据库,但不会立即写入。
  • merge的作用:对于已经在持久化上下文中的持久态对象,merge操作不会做任何额外处理,直接返回原对象——因为此时对象本身已经处于被管理状态,不需要合并。你代码里修改description后调用merge,本质上只是确认了对象的管理状态,并没有触发数据库写入。
  • refresh的行为:强制从数据库重新加载对象的所有属性值,覆盖内存中持久化上下文里的对象状态。由于此时数据库里还没写入修改后的description(事务未提交,脏检查还没执行),所以refresh后对象会回到初始的"Initial Description"。

验证与扩展

如果想让refresh后保留修改值,只需在调用refresh前执行session.flush()——这个方法会强制把持久化上下文里的所有修改同步到数据库,之后refresh读取的就是最新数据了。


内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:04