我知道如果我的对象尚未存在于数据库中,save() 将插入我的对象,如果它已经存在(使用主键字段标识的对象),则将进行更新。
我尝试过如下代码
public void update() throws UpdateFailedException{
boolean b= findByPK(); // checking if the entry is already present.
if(b){
repo.save(object); // saving it, internally it will be updating.
}else{
throw new UpdateFailedException("Object not present to update");
}
}
上面的代码不会满足我的效率要求,因为它多次轮询我的数据库,而且我无法保证其行为的一致性,因为它没有发生在同一事务边界中。(即,即使我得到记录数据库中已经存在,在调用保存之前我的记录有可能从外部边界删除,因此我的保存将执行我想要阻止的插入)
什么是有效的方法来做到这一点?我还需要管理 Spring Data JPA 的事务。
或有什么方法可以让我知道save()
是否正在执行插入? (这样我就可以阻止调用 save()
如果它要执行插入)
最佳答案
假设您有 10 个属性,并且用户刚刚更改了一个属性,因此您可以使用 @DynamicUpdate
,而不是更新所有 10 个属性。这只会更新更改的字段。
hibernate 4+
@DynamicInsert(true)
@DynamicUpdate(true)
<小时/>
@Entity
@Table(name = "User")
@org.hibernate.annotations.Entity(dynamicUpdate = true) //may be deprecated
public class User
<小时/>
@DynamicUpdate
用于指定每当修改实体时应生成 UPDATE SQL 语句。
默认情况下,Hibernate 使用缓存的 UPDATE
设置所有表列的语句。当实体使用 @DynamicUpdate 注释进行注释时,PreparedStatement 将仅包含
其值
已更改
的列。
关于java - 如何使用 spring-boot 阻止插入并仅允许更新我的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55178929/