单事务中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
相关产品推荐
相关产品推荐

