Spring data JPA日常开发问题

用户登陆后更改token时每次会新增一条数据

首先看我的配置,在repostory中继承自

extends JpaRepository<AcountEntity, Long>,JpaSpecificationExecutor<AcountEntity> 

我在service执行saveAndFlush时总是执行新增操作

我最开始以为是游离对象导致的,可根据我以前的经验不管是游离对象还是事务中对象如果遇到save操作都是执行merge

所以我把findByUserNameAndPassword查出一遍后再通过findOne再查找一遍还是新增

解决办法

我通过在SimpleJpaRepostory中打断点了解了它的执行原理

首先SimpleJpaRepostory继承了JpaRepostory,就有了一系列CURD功能

通过this.save()

if(this.entityInformation.isNew(entity)) {
    this.em.persist(entity);
    return entity;
} else {
    return this.em.merge(entity);
}
我们再看entityInfomation.isNew()方法

if(this.versionAttribute != null && !this.versionAttribute.getJavaType().isPrimitive()) {
    DirectFieldAccessFallbackBeanWrapper wrapper = new DirectFieldAccessFallbackBeanWrapper(entity);
    Object versionValue = wrapper.getPropertyValue(this.versionAttribute.getName());
    return versionValue == null;
} else {
    return super.isNew(entity);
}

有三个方法,我都打了断点,发现走的是第二个实现类

JpaMetamodelEntityInformation

this.versionAttribute != null && !this.versionAttribute.getJavaType().isPrimitive()


通过字段得知version不能为null,在version字段更改后就再也没有新增过了

这也是因为手动添加数据的原因导致的,稍后我需要了解为什么修改要依靠version 我当时以为架构师是因为乐观锁原因而新增的,如果有知道的朋友可以留言哦 ! 谢谢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值