jpa merge vs persist 동작방식 및 목적 정리
- merge, persist 동작방식 및 목적을 정리했습니다.
merge
- merge 는 오직 분리된(detached) 엔티티에만 필요합니다.
- 예를 들면 다음과 같습니다.
- 아래와 같이 test 라는 entity 를 persist 를 통해 영속성 상태로 만들었습니다.
- 그런 뒤 entityManager 를 close 해서 test 가 준영속 상태가 됐다고 가정하겠습니다.
- 이런 경우 준영속 상태인 것의 상태를 변경해서 database 에 반영하고 싶습니다. 이럴 때 merge 를 사용해야 합니다.
Test test = new Test();
test.setName("abc");
entityManager.persist(test);
entityManager.close();
merge 동작 방식
- 위 예제를 통해 설명하면, test 라는 entity 의 name 을 "abc" --> "cba" 로 변경해서 db 에 반영하고 싶습니다.
- 아래와 같이 merge 를 수행하면 다음과 같이 동작합니다.
- 1차 캐시에 해당 식별자가 있는지 확인하고 없으면 database 를 조회합니다.
- database 에 값이 있으면 해당 값을 받아오고, 입력받은 test 객체의 값을 복사해서 database 에서 가져온 객체에 copy 를 합니다.
- 그런 뒤 db 에 변경사항을 반영합니다.
- 즉, 이 경우에는 select 후 insert 가 일어납니다.
test.setName("cba");
entityManager.merge(test);
persist
- persist 는 새로운 entity 를 영속성 컨텍스트내에서 관리하고 싶을 때 사용합니다.
- entityManager.persist(xxx) 를 호출하면 바로 insert 쿼리가 동작합니다.
reference