Java 当Detached entity version属性为空时,为什么Hibernate entity manager执行插入而不是更新?
我注意到,当您有一个具有@Version属性的实体,并且您试图通过手动实例化该实体、将其id设置为现有id并调用merge()来更新记录时,Hibernate会执行插入而不是更新。我假设这是因为手动实例化对象的version属性为null。标识符的存在是否足以让Hibernate确定它应该执行更新 示例代码: 假设数据库中有一条id为1的记录,MyEntity的属性版本为@versionJava 当Detached entity version属性为空时,为什么Hibernate entity manager执行插入而不是更新?,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我注意到,当您有一个具有@Version属性的实体,并且您试图通过手动实例化该实体、将其id设置为现有id并调用merge()来更新记录时,Hibernate会执行插入而不是更新。我假设这是因为手动实例化对象的version属性为null。标识符的存在是否足以让Hibernate确定它应该执行更新 示例代码: 假设数据库中有一条id为1的记录,MyEntity的属性版本为@version MyEntity e = new MyEntity(); e.setId(1); e.setName("so
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的记录将被更新。确认您的体验:
对于分离的实例,版本或时间戳属性永远不应为null。Hibernate会将任何具有空版本或时间戳的实例检测为瞬态,而不管指定了哪些其他未保存的值策略
即使它使用ID来确定实体是否分离,尝试合并具有空版本的实体也会导致乐观锁异常。您不应该将分离的对象与空版本合并。这违背了使用乐观锁定的目的。您必须提供完整的
MyEntity
codeWell,重要的一点只有两个属性。Id和版本属性。我将编辑问题以澄清。谢谢。这就是我一直在寻找的。顺便说一句,我知道它违背了乐观锁定的目的,但我在想,也许Hibernate可以将空版本属性转换为“最新版本”,从而覆盖乐观锁定,但无论如何,这可能不是一个好主意。我想有点危险。