使用Spring Data JPA的資料存取層會繼承JpaRepository
,其儲存enity的方法有save()
與saveAndFlush()
,兩者差別如下。
兩者差別在saveAndFlush()
比save()
多呼叫了EntityManager
的flush()
方法,作用為立即將暫存在記憶體的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會接著被查詢及使用。
沒有留言:
張貼留言