我正在使用Hibernate 4.1.7.Final并尝试使用session.merge(entity)
方法更新对象。该实体注释为:
@SelectBeforeUpdate(true)
和@DynamicUpdate(true)
但是,我发现merge方法会覆盖原始的非空字段(在之前的持久化实体中),并且实体被合并为空值 - 这是我不想要的。我以为@DynamicUpdate
只会更新非空值。
Hibernate文档中合并方法的描述是:
使用。将给定对象的状态复制到持久对象上 相同的标识符如果当前没有持久化实例 与会话相关联,它将被加载。返回持久性 实例。如果给定实例未保存,请保存副本并返回 它作为一个新的持久化实例。给定的实例不会成为 与会话相关联。此操作级联到相关联 如果关联使用cascade =“merge”
进行映射,则为实例
任何想法有什么不对?
感谢。
答案 0 :(得分:0)
我能想到的两件事:
根据Hibernate doc,版本/时间戳列(如果使用JPA,则为@Version注释)应该用作乐观锁定策略,以便Session.merge()正确处理对分离实例的修改。请务必使用此策略。
@SelectBeforeUpdate和@DynamicUpdate不可继承,因此请确保注释正确的实体。