gpt4 book ai didi

java - 如何使用 spring-boot 阻止插入并仅允许更新我的对象?

转载 作者:行者123 更新时间:2023-12-01 19:41:46 27 4
gpt4 key购买 nike

我知道如果我的对象尚未存在于数据库中,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com