用户登陆后更改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 我当时以为架构师是因为乐观锁原因而新增的,如果有知道的朋友可以留言哦 ! 谢谢