JPA : @JoinColumn과 @PrimaryKeyJoinColumn의 차이점은 무엇입니까?


82

@JoinColumn과 의 정확한 차이점은 무엇입니까 @PrimaryKeyJoinColumn?

@JoinColumn외래 키의 일부인 열에 사용 합니다. 일반적인 열은 다음과 같을 수 있습니다 (예 : 추가 속성이있는 조인 테이블).

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

열을 PK로 승격하면 (일명 관계 식별) 어떻게 되나요? 이제 열이 PK이므로 다음과 @Id같이 태그를 지정해야합니다 .

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

이제 질문은 다음과 같습니다.

있습니까 @Id+ @JoinColumn단지와 같은 @PrimaryKeyJoinColumn?

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

그렇지 않다면 무엇을 @PrimaryKeyJoinColumn위해 있습니까?

답변:


54

열을 PK로 승격하면 (일명 관계 식별) 어떻게됩니까? 이제 열이 PK이므로 @Id (...)로 태그를 지정해야합니다.

이러한 향상된 지원 유래 식별자는 실제의 일부 JPA 2.0 새로운 재료 (참조 섹션 2.4.1 기본 키 유도 아이덴티티에 대응 JPA 2.0 명세서), JPA 1.0 허용하지 않는 Id(A)에 OneToOneManyToOne. JPA 1.0에서는 외래 키 열에 대한 매핑 을 사용 PrimaryKeyJoinColumn하고 정의해야 Basic Id합니다.

이제 질문은 @Id + @JoinColumn이 @PrimaryKeyJoinColumn과 동일합니까?

당신은 유사한 결과를 얻을 수 있지만, 사용 수 IdOneToOne또는 것은 ManyToOne이다 훨씬 간단 하고 JPA 2.0 파생 된 식별자를 매핑 할 수있는 좋은 방법입니다. JOINED 상속 전략 PrimaryKeyJoinColumn에서 여전히 사용될 수 있습니다 . JPA 2.0 사양의 관련 섹션 아래 :

11.1.40 PrimaryKeyJoinColumn 주석

그만큼 PrimaryKeyJoinColumn주석 다른 테이블에 참여하는 외부 키로서 사용되는 기본 키 열을 지정한다.

PrimaryKeyJoinColumn주석은의 엔티티 서브 클래스의 기본 테이블에 가입하는 데 사용되는 JOINED 슈퍼 클래스의 기본 테이블에 매핑 전략을; SecondaryTable어노테이션 내에서 2 차 테이블을 1 차 테이블에 결합하는 데 사용됩니다 . OneToOne 참조 엔티티의 기본 키가 참조 엔티티에 대한 외래 키로 사용되는 매핑에 사용될 수 있습니다. [108] .

...

PrimaryKeyJoinColumn JOINED 매핑 전략에서 하위 클래스에 대한 주석이 지정 되지 않은 경우 외래 키 열은 수퍼 클래스 기본 테이블의 기본 키 열과 동일한 이름을 갖는 것으로 간주됩니다.

...

예: Customer 및 ValuedCustomer 하위 클래스

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }

[108] 파생 ID 메커니즘 섹션 2.4.1.1에 기재된 해주기 통해 선호한다 PrimaryKeyJoinColumn OneToOne 매핑 경우에.

또한보십시오


이 소스 http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state 는 @ManyToOne 및 @Id 사용이 JPA 1.x에서 작동한다고 설명합니다. 이제 누가 맞습니까?

저자는 JPA 1.0 (!)에 대한 기사를 작성하기 위해 EclipseLink 의 사전 릴리스 JPA 2.0 호환 버전 ( 기사 당시 버전 2.0.0-M7 )을 사용하고 있습니다. 이 기사는 오해의 소지가 있습니다. 저자는 JPA 1.0의 일부 아닌 있습니다.

기록을 위해 EclipseLink 1.1 에 Idon OneToOne및 지원 ManyToOne이 추가되었습니다. 이 메시지 에서 제임스 서덜랜드 , EclipseLink가 comitter과의 주요 기여 자바 지속성 위키 책). 그러나 이것은 JPA 1.0의 일부 가 아닙니다 .


이 소스 인 weblogs.java.net/blog/felipegaucho/archive/2009/10/24/… 에서는 @ManyToOne 및 @Id를 사용하는 것이 JPA 1.x에서 작동한다고 설명합니다. 이제 누가 맞습니까?
Kawu

확인. 정리해 주셔서 감사합니다. 참조 된 나쁜 예가 @IdClass를 잘못 사용하는 것이 맞습니까? @Id 주석이 올바른 엔티티 클래스의 별도 (중복 / 중복) 열에 배치되어야하지 않습니까? (나는 @IdClass 더 이상 사용하지 않는 것이 좋습니다 사용하는 것을 알고 있지만 VEN)
Kawu

클래스에는 두 가지 속성이 있어야합니다. @Id @Column private String 기관; 및 @Id @Column 개인 문자열 경쟁; PK를 지정하기 위해서 죠?
Kawu

@Kawu 미안하지만 솔직히 작은 댓글 상자에서 토론하기가 너무 어렵습니다. 나는 당신이 말하는 것을 이해했는지조차 확신하지 못합니다. 다른 특정 질문이있는 경우 JPA 구현을 선택하고 약간의 실험을하거나 전체 예제 (및 JPA 버전) 로 질문 을 게시하는 것이 좋습니다 . 이것은 일을 훨씬 쉽게 만들 것입니다.
Pascal Thivent

37

일반적으로이 다이어그램을 통해이 두 가지를 구분합니다.

사용하다 PrimaryKeyJoinColumn

여기에 이미지 설명 입력

사용하다 JoinColumn

여기에 이미지 설명 입력


2
@yusher, PrimaryKeyJoinColumn동일한 기본 키 값을 사용하여 두 테이블을 조인하고 JoinColumn, 기본 테이블의 기본 키가 다른 테이블에서 외래 키가됩니다.
Sam YC

2

나는 이것이 오래된 게시물이라는 것을 알고 있지만 PrimaryKeyColumn, 단방향 관계를 원하거나 모두 동일한 ID를 공유하는 여러 테이블이있는 경우 사용하기에 좋은시기 입니다.

일반적으로 이것은 나쁜 생각이며 외래 키 관계를와 함께 사용하는 것이 좋습니다 JoinColumn.

그러나 이와 같은 시스템을 사용하는 이전 데이터베이스에서 작업하는 경우에는 사용하기에 좋은시기입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.