CrudRepository接口的save方法的记录判断

实现CrudRepository接口的save方法进行记录更新时,遇到了更新记录反而插入新纪录的情况,经过探究发现,还是对源码不熟,对该方法的逻辑未清晰。下面通过这个bug来探究CrudRepository接口的save方法的记录判断。


首先看下CrudRepository接口的save方法的源码:

@Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);//entity记录是新的则插入该记录至数据库
            return entity;
        } else {
            return em.merge(entity); //如果该记录不是新的,则更新该记录(我原意便是更新记录)
        }
    }

从源码可以发现,save方法是有两个功能,通过判断实体是否为新的来进行不同的操作。那么它的判断标准是什么呢?经过探究与实践,发现是通过实体主键来进行判断实体是否为新的实体数据记录。


我的代码:

public class DistributedNode {
    @Id
    String ip;
    ****
    }
//执行save方法
distributedNodeDao.save(distributedNode);

需要标识实体的主键,并且在执行save方法的时候,该主键未变,则save方法为更新字段,若主键为新的,或者该实体未标示主键,则执行save方法则会直接插入新的记录

你可能感兴趣的:(后端Spring,Boot,java)