gpt4 book ai didi

java - 使用 Spring 数据 jpa 强制插入

转载 作者:行者123 更新时间:2023-11-29 09:10:02 26 4
gpt4 key购买 nike

我想强制 CrudRepository#save(entity) 插入一个新实体,而不是先选择实体并在主键已存在时更新它。

我举个例子

public class Lock
{
@Id
@Column
private UUID uuid;
...
}


UUID id = UUID.randomUUID();
Lock firstLock = new Lock(id);
Lock secondLock = new Lock(id);
repo.save(firstLock);
repo.save(secondLock);

发生的事情是,第一个保存操作执行了以下两个语句

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: insert into locks (expires, uuid) values (?, ?)

第二次调用保存时执行更新语句

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: update locks set expires=? where uuid=?

我如何确保第二次保存调用不会简单地更新以前存储的记录?我希望它执行插入语句并失败,因为相同的主键已经存在

最佳答案

在 Spring Data JPA 中不允许强制插入 ID 不为 null 的实体。

通常,Id 生成器用于主键,以确保生成的 ID 是唯一的。 (例如@GeneratedValue(strategy = GenerationType.AUTO))

我认为这种行为是正确的。在 ORM 中,使用 new 运算符表示有意创建一个新实体,并隐含要求为其分配一个唯一 ID。

但是如果您无论如何都想尝试一下,您可以查看自定义的@GenericGenerator。

http://www.georgestragand.com/jpaseq.html

关于java - 使用 Spring 数据 jpa 强制插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com