網頁

2020/8/28

Spring Data JPA JpaRepository save() 與 saveAndFlush() 差別

使用Spring Data JPA的資料存取層會繼承JpaRepository,其儲存enity的方法有save()saveAndFlush(),兩者差別如下。

兩者差別在saveAndFlush()save()多呼叫了EntityManagerflush()方法,作用為立即將暫存在記憶體的entity狀態同步至料庫(但仍未提交)。

JpaRepository的實作類別SimpleJpaRepository原始碼如下。可以看到saveAndFlush()先呼叫save(),接著呼叫flush()

SimpleJpaRepository

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
    ...
    @Transactional
    @Override
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
    ...
    @Transactional
    @Override
    public <S extends T> S saveAndFlush(S entity) {

        S result = save(entity);
        flush();

        return result;
    }
    ...
    @Transactional
    @Override
    public void flush() {
        em.flush();
    }
    ...
}

saveAndFlush()使用時機為在同交易中被更新的entity會接著被查詢及使用。

沒有留言:

張貼留言