繁体   English   中英

如何防止插入并仅允许使用spring-boot更新对象?

[英]How can I prevent insert and allow only update of my object using spring-boot?

我知道save()将插入我的对象(如果它尚不存在于db中),并且将进行更新(如果它已存在)(使用主键字段标识的对象)。

我已经尝试过如下代码

 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");
        }
 } 

上面的代码不能满足我的效率要求,因为它多次轮询数据库,并且由于它不在同一事务边界中发生,所以我不能保证其行为的一致性。(即即使我知道记录已经存在于db,有可能在调用保存之前将我的记录从外部边界中删除,因此我的保存将执行我想防止的插入操作)

有什么有效的方法可以做到这一点? 我还需要管理spring数据JPA的事务。

还是有什么办法可以知道save()是否在执行插入操作 (这样我就可以防止在执行插入操作时调用save()

假设您有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用于指定whenever an entity is modified.都应生成UPDATE SQL语句whenever an entity is modified. 默认情况下,Hibernate使用cached UPDATE语句来设置所有表列。 当使用@DynamicUpdate批注对实体进行批注时,PreparedStatement将include onlyvalueschanged的列。

我假设您在数据库中不存在该对象时将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");
        }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM