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

@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위해 있습니까?



답변

열을 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의 일부 가 아닙니다 .


답변

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

사용하다 PrimaryKeyJoinColumn

여기에 이미지 설명 입력

사용하다 JoinColumn

여기에 이미지 설명 입력


답변

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

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

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


답변