jpa save()에서 찾은 entity 생명주기와 entity manager의 기능

MoonDD·2023년 2월 15일
0

jpa에서 객체를 save()할때

  • 해당 entity의 @id가 null이면 해당 entity의 생명주기는 Transient이다. → EntityManager가 persist()를 호출
  • 해당 entity의 @id가 null이 아니면 해당 entity의 생명주기는 Detached이다. → EntityManger가 merge()를 호출
  • Persistent는 persistent 컨텍스트가 관리하고 있는 상태이다.

Class A

  • id
  • name

위와 같은 엔티티가 있다고 가정하면 (그냥 흐름 파악을 위해 문법에 안 맞는 코드로 작성하겠다.)


a = new A()
a.name = “name” 
B = save(a)

위와 같이 A entity에 name만 정의하고 save를 하면 a 와 반환값 B는 EntityManger가 persist()를 호출하여 entitymange가 관리하고 있다. 그리고 두 객체는 동일한 값을 가르키고 있다. 그래서 save후에 a, b를 변경하면 그대로 db에 업데이트가 된다.

하지만


a = new A()
a.id = 1
a.name = “name” 
B = save(a)

위와 같이 A entity에 a에 id, name을 정의하고 save를 하면 entitymanger는 merge()를 호출하여 B는 detached상태이고 a는 entitymanager가 관리하지 않는다. 그래서 나중에 a를 변경해도 쿼리에 영향이 안간다!

횡설수설하고 있고 잘못된 정보를 가지고 있을수도 있다!

아래 참조에 아주 잘 설명되어 있으니 나중에 다시 확인하고 리마인드하는 것이 좋을 것 같다.

참조


Spring Data JPA - save()

[Spring] JPA save의 숨겨진 기능?? 😮

0개의 댓글