[英]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 only
其values
已changed
的列。
我假设您在数据库中不存在该对象时将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.