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

Injun Jeong님의 프로필 이미지

작성한 질문수

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

@GeneratedValue 질문입니다.

해결된 질문

20.02.09 20:08 작성

·

254

0

안녕하세요 김영한 선생님

'프록시와 연관관계 관리 - 영속성 전이(CASCADE)와 고아 객체' 강의를 수강하는 중,

해당 강좌의 7분 58초 부분에 @GeneratedValue에 의해 생성된 PK 값에 대한 질문입니다.

질문: "단일 소유자(엔티티, 부모)인 PARENT에 완전 종속이 되는 CHILD이기 때문에, child 엔티티 PK 값의 GeneratedValue 또한 parent로 부터 영향을 받는가요?"

이와 같은 질문은 다음의 과정들로 인해 가지게 되었습니다.

강좌에서 생성된 parent 엔티티의 PK는 1, 그리고 각각의 child 엔티티의 PK는 2와 3이 할당(Generated)되었습니다.

저는 'PARENT와 CHILD는 서로 다른 테이블이기 때문에, parent 엔티티의 PK 값은 1이 할당되고, 각각의 child 엔티티 PK 값은 1과 2가 할당되어야 하는 것이 아닌가?' 라는 궁금증이 생겼습니다.

이를 확인하기 위해 다음과 같이 수행해 보았으며 사진과 같은 결과를 얻었습니다.

parent PK: 1, 4
child PK: 2, 3, 5, 6

이러한 결과로 인해, 위의 질문과 같은 정리를 하였는데 제가 제대로 이해한 것이 맞을까요?

(+) 코드 내의 주석처리한 m.t. (= my thought) 부분 또한 제가 제대로 이해한 것이 맞을까요?


======

그리고, 좋은 강의 너무 감사드립니다. 

답변 7

1

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

2020. 02. 11. 01:34

네^^ 또 궁금한 내용이 있으면 언제든지 편하게 질문 주세요 ㅎㅎ

1

Injun Jeong님의 프로필 이미지
Injun Jeong
질문자

2020. 02. 11. 00:25

'테이블마다 키 값을 다르게 하려면 키 생성 전략이 시퀀스이면, 다른 시퀀스를 사용하면 되고' 말씀을 들으니 '아!' 싶네요ㅠ 고맙습니다.

늦은 시간까지 답변 주셔서 감사합니다~!

1

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

2020. 02. 11. 00:04

네 답변 주신 것 처럼 다음 질문에 대한 답은 영향을 받지 않는다 입니다^^

질문: "단일 소유자(엔티티, 부모)인 PARENT에 완전 종속이 되는 CHILD이기 때문에, child 엔티티 PK 값의 GeneratedValue 또한 parent로 부터 영향을 받는가요?"

테이블마다 키 값을 다르게 하려면 키 생성 전략이 시퀀스이면, 다른 시퀀스를 사용하면 되고, 테이블 전략이면 다른 키를 사용하면 됩니다. 아마 지금 시퀀스 전략이어서 같은 값을 사용하는 것 같아요. 기본키 매핑 강의를 참고해서 다른 시퀀스를 사용하도록 설정해주시면 됩니다^^

0

Injun Jeong님의 프로필 이미지
Injun Jeong
질문자

2020. 02. 11. 01:43

네, 고맙습니다 :)

0

Injun Jeong님의 프로필 이미지
Injun Jeong
질문자

2020. 02. 10. 12:51

혹여나 제가 실수한 부분이 있을까봐, 코드도 첨부하겠습니다~!

0

Injun Jeong님의 프로필 이미지
Injun Jeong
질문자

2020. 02. 10. 12:23

고맙습니다 선생님,

1) Parent 클래스에 영속성 전이 기능 적용한 경우 (cascade = CascadeType.ALL)

2) 영속성 전이 기능 미적용 및 각각의 객체들에게 persist를 호출한 경우

1)과 2) 두 가지 경우 모두 사진과 같은 동일한 결과를 보여주었습니다.

0

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

2020. 02. 09. 22:03

안녕하세요. Injun Jeong님

다양한 테스트를 해보고, 또 질문도 잘 정리해주셨네요. 감사합니다.

질문을 보면서 저도 궁금한점이 있어서 문의드립니다.

질문: parent와 child에서 영속성 전이 기능을 적용했을 때와, 제거 하고 직접 persist를 호출 했을 때 parent, child 테이블에 입력된 각각의 PK 값을 비교해서 알려주세요.

m.t 부분은 개념상 그렇게 이해하시면 충분합니다.(구현은 구현체마다 최적화 방식이 다를 수 있습니다.)