用弹簧数据jpa强制插入

时间:2012-10-18 16:39:36

标签: java spring-data-jpa

我想强制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语句并失败,因为已经存在相同的主键

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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