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

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

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

相关文章:

java - 比较对象,相同的内容,不同的 id(在 eclipse 调试器中)

java - 依赖注入(inject)、延迟注入(inject)实践

java - 缺少请求正文的 Spring Boot POST 请求?

java - Spring MVC 3 JSF 2 与 Maven

java - 使用 EclipseLink 在 JPA、hibernate 中重命名 persistence.xml 时出现问题

java - 如何排除一个方法是@Transactional?

java - Hibernate自定义删除查询多行

java - offsetByCodePoints 与整数迭代器

java - GWT:使用 JSNI 的 native 方法:如何动态调用方法

java - 动态调度和通用接口(interface)工厂