【问题标题】:How can I prevent insert and allow only update of my object using spring-boot?如何防止插入并只允许使用 spring-boot 更新我的对象?
【发布时间】:2019-08-06 07:35:46
【问题描述】:

我知道 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() 如果它要进行插入)

【问题讨论】:

  • 如果对象中有 PK id,它将更新实体。您可以检查并跳过从数据库中提取数据(ID 应该存在于数据库中!)。您可以在存储库中创建仅更新方法。
  • 您能详细说明一下吗?
  • I cannot guarantee the consistency in its behavior since its not happening in the same transaction boundary。这很容易解决,使用@Transactional

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

假设您有 10 个属性,而用户刚刚更改了一个属性,因此您可以使用 @DynamicUpdate 而不是更新所有 10 个属性。这只会更新更改的字段。


休眠 4+

@DynamicInsert(true)
@DynamicUpdate(true)

@Entity
@Table(name = "User")
@org.hibernate.annotations.Entity(dynamicUpdate = true) //may be deprecated
public class User 

@DynamicUpdate 用于指定应生成 UPDATE SQL 语句whenever an entity is modified. 默认情况下,Hibernate 使用设置所有表列的cached UPDATE 语句。当使用@DynamicUpdate 注释对实体进行注释时,PreparedStatement 将转到include onlyvalues 已为changed 的列。

【讨论】:

  • 这怎么能阻止新实体的插入?
【解决方案2】:

我假设当你的数据库中不存在对象时你将 Id 设置为 0,所以如果它是更新的对象,它应该有一个 Id != 0

public void update() throws UpdateFailedException{


   if(object.getId() != 0){

          repo.save(object); // saving it, internally it will be updating.
   }else{

         throw new UpdateFailedException("Object not present to update");
        }
 }

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 2023-01-06
    • 2020-06-14
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2021-03-15
    相关资源
    最近更新 更多