我想强制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=?
如何确保第二次保存调用不会简单地更新以前存储的记录?我希望它执行一个insert语句并失败,因为已经存在相同的主键
答案 0 :(得分:0)
在Spring Data JPA中不允许强制插入on id为非null的实体。
通常,Id生成器用于主键,以确保生成的ID是唯一的。 (例如@GeneratedValue(strategy = GenerationType.AUTO))
我认为这种行为是正确的。在ORM中,使用new运算符表示有意创建一个具有隐式要求的新实体,以便为其分配唯一ID。
但是如果你想尝试它,你可以查看一个自定义的@GenericGenerator。