Spring data JPA日常开发问题

    xiaoxiao2021-12-14  22

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

    转载请注明原文地址: https://ju.6miu.com/read-963217.html

    最新回复(0)