【发布时间】:2015-02-04 19:32:55
【问题描述】:
我注意到,当您有一个具有 @Version 属性的实体并尝试通过手动实例化该实体、将其 id 设置为现有 id 并调用 merge() 来更新记录时,Hibernate 执行插入而不是更新。我认为这是因为手动实例化对象的版本属性为空。标识符的存在是否足以让 Hibernate 确定它应该执行更新?
示例代码:
假设数据库中有一条 id=1 的记录,并且 MyEntity 有一个带有 @Version 的属性版本。
MyEntity e = new MyEntity();
e.setId(1);
e.setName("some updated value");
entityManager.merge(e);
这最终会执行插入而不是更新。
MyEntity 类似于:
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
@Column("name")
String name;
@Version
Integer version;
}
如果我删除 @Version,它会按预期工作,id=1 的记录会更新。
【问题讨论】:
-
你必须提供完整的
MyEntity代码 -
嗯,重要的一点只有两个属性。一个 Id 和一个 Version 属性。我将编辑问题以澄清。