Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当Detached entity version属性为空时,为什么Hibernate entity manager执行插入而不是更新?_Java_Hibernate_Jpa_Orm - Fatal编程技术网

Java 当Detached entity version属性为空时,为什么Hibernate entity manager执行插入而不是更新?

Java 当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

我注意到,当您有一个具有@Version属性的实体,并且您试图通过手动实例化该实体、将其id设置为现有id并调用merge()来更新记录时,Hibernate会执行插入而不是更新。我假设这是因为手动实例化对象的version属性为null。标识符的存在是否足以让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的记录将被更新。

确认您的体验:

对于分离的实例,版本或时间戳属性永远不应为null。Hibernate会将任何具有空版本或时间戳的实例检测为瞬态,而不管指定了哪些其他未保存的值策略


即使它使用ID来确定实体是否分离,尝试合并具有空版本的实体也会导致乐观锁异常。您不应该将分离的对象与空版本合并。这违背了使用乐观锁定的目的。

您必须提供完整的
MyEntity
codeWell,重要的一点只有两个属性。Id和版本属性。我将编辑问题以澄清。谢谢。这就是我一直在寻找的。顺便说一句,我知道它违背了乐观锁定的目的,但我在想,也许Hibernate可以将空版本属性转换为“最新版本”,从而覆盖乐观锁定,但无论如何,这可能不是一个好主意。我想有点危险。