티스토리 뷰

📌 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) 동작방식

  1. entity의 @Id 값으로 1차 캐시에서 엔티티를 조회한다.
  2. 1차 캐시에 엔티티가 없으면 DB에서 엔티티를 조회하고, 1차 캐시에 저장한다.
  3. 새로운 값으로 엔티티의 값을 채워넣는다.
  4. 영속 상태인 엔티티를 반환한다.

📌 saveAll()

리스트로 된 여러개의 엔티티를 저장할 때 두가지 방법이 있다.

 

  1. for 루프를 사용해서 여러번 save() 함수를 호출
  2. saveAll() 함수를 사용

→ 엔티티가 여러 개일 경우 성능상으로 saveAll() 함수를 사용하는 것이 더 빠르다.

save(), saveAll() 둘 다 @Transactional이 선언되어있다. → 메소드를 호출하면 프록시 로직이 실행

save()를 100번 호출하면 프록시 로직이 100번이 동작한다.

saveAll()은 내부의 save() 함수를 호출하기 때문에 프록시 로직이 1번만 실행된다.

 

📌 saveAndFlush() 

save() 후 flush() 함수를 호출해서 바로 DB에 데이터를 반영한다.

 

📌 Reference

https://n1tjrgns.tistory.com/256

https://sas-study.tistory.com/388

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함