2012-10-18 74 views
2

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

我会尽力举一个例子

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

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

回答

0

在Spring Data JPA中,不允许强制对ID为非空的实体插入insert。

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

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

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

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