3

我想强制 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 (?, ?)

而第二次调用 save 执行更新语句

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=?

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

4

1 回答 1

1

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

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

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

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

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

于 2012-10-18T17:17:19.877 回答