티스토리 뷰
📌 save() : INSERT OR UPDATE
save 프로세스
entityInformation.isNew(entity) == true 일 때 (INSERT)
→ entity의 @Id가 원시타입 & 값이 null 또는 entity의 @Id가 Number 클래스 상속 & 값이 0 일 때
→ em.persist(entity) : Transient/New(비영속) 상태의 엔티티이기 때문에 commit 시점에 DB에 INSERT
entityInformation.isNew(entity) == false 일 때 (UPDATE)
→ em.merge(entity)
em.merge(entity) 동작방식
- entity의 @Id 값으로 1차 캐시에서 엔티티를 조회한다.
- 1차 캐시에 엔티티가 없으면 DB에서 엔티티를 조회하고, 1차 캐시에 저장한다.
- 새로운 값으로 엔티티의 값을 채워넣는다.
- 영속 상태인 엔티티를 반환한다.
📌 saveAll()
리스트로 된 여러개의 엔티티를 저장할 때 두가지 방법이 있다.
- for 루프를 사용해서 여러번 save() 함수를 호출
- saveAll() 함수를 사용
→ 엔티티가 여러 개일 경우 성능상으로 saveAll() 함수를 사용하는 것이 더 빠르다.
save(), saveAll() 둘 다 @Transactional이 선언되어있다. → 메소드를 호출하면 프록시 로직이 실행
save()를 100번 호출하면 프록시 로직이 100번이 동작한다.
saveAll()은 내부의 save() 함수를 호출하기 때문에 프록시 로직이 1번만 실행된다.
📌 saveAndFlush()
save() 후 flush() 함수를 호출해서 바로 DB에 데이터를 반영한다.
📌 Reference
'dev_note > TIL' 카테고리의 다른 글
ASP.NET Authorize Header에 access token 넣기 (0) | 2022.06.27 |
---|---|
@Modifying 알아보기 (0) | 2022.06.26 |
orphanRemoval = true & CascadeType.REMOVE (0) | 2022.06.24 |
Spring Boot Custom Validation Annotation 만들기 (0) | 2022.06.18 |
Model 유효성 에러 Filter로 처리하기 (0) | 2022.06.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- @Modifying
- 영속성
- orphanRemoval
- JavaScript
- 자바의 정석
- 스프링 부트 테스트
- jQuery
- spring boot
- SpringBoot
- Spring
- MSSQL
- Java
- c#
- C# 문법
- ASP.NET
- 준영속
- 토비의 스프링
- default interface
- 다이내믹 프록시
- JPA
- 고아 객체
- DataAnnotation
- 스프링MVC
- 빌더 패턴
- Effective Java
- 스프링
- JpaRepository
- uploadfive
- OWIN
- Nullable
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함