강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

실전 예제 5 - 연관관계 관리

em.persist(orderItem) 주석

작성

·

45

0

[질문 내용]

스크린샷 2025-01-23 204126.png

따로 주석 설명을 달긴 하였지만, Order 엔티티에서 OrderItem 엔티티를 영속성 전이 ALL로 설정을 해놓았으면 굳이 em.persist(orderItem)을 생략해도 잘 동작되는 거죠?

 

 

추가 질문)

스크린샷 2025-01-23 204351.png스크린샷 2025-01-23 204448.png

위 2개 이미지에서 보시면 첫번째 사진은 em.persist(orderItem)을 생략했을때 나온 쿼리문이고 두번째 사진은 생략하지 않을 때 나오는 쿼리문인데 왜 update 쿼리가 나가는 건지 잘 이해가 안돼서 여쭈어 봅니다.


답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. soojinkimss님

처음의 경우 JPA가 자동으로 저장하기 때문에 저장 순서에 이슈가 없습니다.

직접 persist 하는 경우에 저장하는 순서가 중요한데요.

Order를 먼저 Persist 한 이후에 OrderItem을 Persist 하시면 순서가 맞아서 update 쿼리가 발생하지 않을거에요.

감사합니다.

soojinkimss님의 프로필 이미지
soojinkimss
질문자

저장 순서가 핵심이군요~정말 감사합니다!!

0

안녕하세요, 인프런 AI 인턴입니다.

soojinkimss님이 올리신 질문에 대한 내용을 정리해보겠습니다. 먼저, em.persist(orderItem)을 생략해도 잘 동작하는 이유는 Order 엔티티에 OrderItem 엔티티를 영속성 전이(CascadeType.ALL)로 설정했기 때문입니다. 이렇게 설정하면 Order를 저장할 때 연관된 OrderItem도 자동으로 저장됩니다. 따라서, em.persist(orderItem)을 명시적으로 호출할 필요가 없습니다.

추가적인 질문에 대한 답변입니다. 두 번째 이미지에서 update 쿼리가 나가는 이유는 영속성 전이와 관련된 변경 감지 때문입니다. JPA에서는 엔티티의 상태가 변경되면 자동으로 이를 감지하고 해당 내용을 DB에 반영합니다. em.persist(orderItem)을 명시적으로 호출하게 되면, OrderItem 엔티티가 영속 컨텍스트에 이미 존재하는 상태가 되며, em.persist 호출 후 일부 필드가 변경되는 경우 JPA가 이를 감지하고 update 쿼리를 발생시킬 수 있습니다.

관련해서 더 많은 정보와 예제를 확인하시려면 아래 URL들을 참고하실 수 있습니다:
1. OrderService의 order() 메서드 호출시 OrderItem Insert에 대해 궁금한 점이 있습니다.
2. 상품주문 테스트에 대한 질문있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

질문하기