@JoinColumn 의 name, referencedColumnName 에 대해 질문 드립니다.
11611
작성한 질문수 13
선생님 2가지 질문이 있습니다.
첫번째는 @JoinColumn 의 name 속성 사용방법에 대한 질문입니다.
@JoinColumn 의 name 속성을 사용하는 방법이
여러가지가 있는거 같은데요.
1) 참조 하고자 하는 엔티티 클래스명 + _ + 엔티티 클래스 기본키 필드 이름
2) 참조 하고자 하는 엔티티 클래스의 필드명 + _ + 엔티티 클래스기본키 필드 이름
3) 현재 엔티티 클래스의 필드명 + _ + 참조하는 테이블의 기본키 컬럼명
수업중에 사용하신 코드에서 구체적예를 가져와봤습니다.

1 번 방법은 Order 엔티티에서 Member 엔티티를 매핑 한 부분에서 사용된 방법입니다.
처음에는 Order 엔티티에서 매핑하는 MEMBER_ID 가 매핑하고자 하는 테이블의 컬럼명(Member 테이블의 MEMBER_ID 필드)이라고 생각했지만,
Member 엔티티의 @Column(name = "MEMBER_ID") 부분을 제거하고 코드를 동작해도 데이터 입력처리가 되기 때문에
테이블 컬럼명이 아니라고 생각했습니다.

2번 방법의 경우, Category 엔티티에서 셀프 매핑(parent)을 할 때 사용하는 경우
3번 방법은 기본값(name 을 입력하지 않은 경우)
이렇게 사용할 수 있는 거 같은데, 맞나요.?
두번째는 @JoinColumn의 referencedColumnName 에 사용처에 관한 내용입니다.
위에서 제가 언급한 name 속성을 사용하는 방법 중에서 1번, 2번 같이 엔티티 클래스 필드 이름을 사용하여 매핑하는 방법을 사용하면,
외래키가 참조하는 대상 테이블의 컬럼명이 다르다 하더라도 referecedColumnName 을 사용안하고 매핑할 수 있는 거 같은데 맞을까요.?
제가 생각하는 것이 맞다면, referencedColumnName 을 사용 할 일이 거의 없을 꺼 같은데 추가적인 사용처가 있을지 궁금합니다.
답변 3
22
안녕하세요. 햇병아리님
예제로 설명드릴께요.
------------ 테이블 ------------
Member
- memberId(PK)
- teamId(FK)
Team
- teamId(PK)
------------- 객체 ----------------------
Member {
@JoinColumn(name="teamId")
Team team;
}
여기서 Member와 team이 연관관계가 있는데요. 여기서 @JoinColumn의 name은 FK 이름입니다.
이제 조인을 하려면 FK가 조인할 대상 테이블의 컬럼이 있어야겠지요? 이게 바로 referencedColumnName입니다.
그런데 referencedColumnName을 사용하지 않는 이유는 바로 referencedColumnName을 생략하면 대상 테이블의 PK로 자동 지정되기 때문입니다.
따라서 여기서는 Member.teamId(FK) -> Team.teamId(PK)를 조인하면서 연관관계가 처리됩니다.
referencedColumnName을 PK가 아닌 다른 컬럼에 직접 지정할 수도 있지만 정규화 관점에서 권장하지는 않습니다.
감사합니다.
13
네 JPA는 대상 테이블을 엔티티를 보고 인지합니다^^
다음의 경우 Team 객체가 매핑된 테이블이 대상 테이블이 되는 것이지요.
Member {
@JoinColumn(name="teamId")
Team team;
}
4
자세한 설명 감사합니다.
선생님, referencedColumnName 을 생략하면 대상 테이블의 pk로 자동 지정한다고 했는데,
JPA 는 대상테이블이 어떤것인지 어떻게 아는 것인가요.?
@JoinColumn 이 적용되는 필드 타입을 보고 판단한다고 생각하면 되나요.?
실무 조언 관련 질문입니다.
0
39
1
H2데이터베이스 파일 생성
0
48
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
46
1
JPQL 메소드와 락
0
49
1
Delivery @OneToOne
0
55
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
80
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
79
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
76
1
영속성 컨텍스트
0
61
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
62
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
104
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
173
2





