spring数据JPA如何决定调用entityManager.persist(...)或entityManager.merge(...)方法

Arg*_*dhu 9 spring spring-data

当调用entityManager.persist(...)-Method并且在spring数据jpa中调用entityManager.merge(...)时.根据文档: 如果实体尚未持久化,Spring Data JPA将通过调用entityManager.persist(...)-Method来保存实体,否则将调用entityManager.merge(...)-Method ...

那么Spring数据如何确定实体是否持久化?

Elb*_*bek 14

这是save方法(in SimpleJpaRepository)的impl :

/*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
     */
    @Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以它看起来entityInformation.isNew(entity).这种方法的实现是(in AbstractPersistable):

public boolean isNew() {

        return null == getId();
    }
Run Code Online (Sandbox Code Playgroud)

所以它决定基于id字段

  • 这基本上是正确的,但如果您使用“@Version”,它也必须包含在内。 (2认同)