728x90
반응형
spring-data-jpa 에서 save 동작 원리
- source 부터 살펴보기.
- 아래 소스를 살펴보면 entity 가 이미 영속성에 등록돼있으면 merge 를 없으면 persist 를 실행하게 돼있다.
- merge 는 해당 ID 가 영속성에 존재하면 update 를 수행. 없으면 INSERT 를 수행한다.
- 여기서 주의할 점은 ID 가 없을 경우 SELECT 를 시도하는 경우가 있을 수 있다는 것.
- 기본키 생성 전략이 없을 경우 (애플리케이션에서 생성) SELECT 를 수행한 후, INSERT 를 실행하기에 쿼리가 2배로 실행됨.
- persist 의 경우 INSERT 쿼리만 실행 됨.
- 즉, 정리하면 merge 는 기존의 객체가 존재할 경우 사용하면 좋고, persist 는 새로운 객체를 생성할 때 좋음.
@Transactional
@Override
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
S result = em.merge(entity);
return result;
// return em.merge(entity);
}
}
'Jpa' 카테고리의 다른 글
MyBatis, Jpa 2개를 동시에 처리하는 트랜잭션 매니저 (0) | 2020.10.21 |
---|---|
spring-boot Jpa 복합키 설정 Embedded (0) | 2020.09.06 |
spring-boot, Jpa 정리 - Transaction 묶음 (0) | 2020.07.11 |
spring-boot, Jpa 정리 - Integrate test (Jpa 통합 테스트) (0) | 2020.07.11 |
spring-boot, Jpa 정리 - Insert, Update bulk 처리 (0) | 2020.07.11 |
댓글