jpa中的小问题,save方法

asOrderEntity.setLastUpdatedAt(LocalDateTime.now()); 
asOrderEntity.setLastUpdatedBy(UserHelper.getUserId());
asOrderRepository.save(asOrderEntity);

jpa自带的save方法保存修改数据很方便,但是你知道他是如何保存修改数据的么?
save方法保存修改数据首先会根据标注为主键的字段去查询是否存在这样一条数据,如果存在则是修改,如果不存在则是添加。
那么问题就来了,如果是修改的话,save方法是如何判断哪个字段是被修改过的呢?答案是不会判断,他会把整个对象的数据都保存下来,无论你是否修改了这个字段。
但是我们都知道这很浪费资源,jpa作为一个很多人使用的框架自然也给出了解决办法。就是在entity类上加上注解@DynamicUpdate
@DynamicInsert。

@DynamicUpdate//自动修改
@DynamicInsert//自动添加
@Data
@Entity
@Table(name = "as_order")
public class AsOrderEntity {

这样jpa就会自动捕获那些被手动设置了值的字段进行修改了。
比如

asOrderEntity.setLastUpdatedAt(LocalDateTime.now()); 
asOrderEntity.setLastUpdatedBy(UserHelper.getUserId());
asOrderRepository.save(asOrderEntity);

这个时候,order表的数据就会根据id找到这个数据,然后只修改他的最后修改人和最后修改时间字段。
最后,提醒一句,在所有修改保存数据的地方,我们都应该认真思考高并发的时候会不会出现脏数据。如果有可能出现,记得加锁。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值