web-dev-qa-db-ja.com

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は何のためにありますか?

73
Kawu

列をPKに昇格させた場合(関係を識別することもできます)、どうなりますか?列は現在PKであるため、@ Id(...)でタグ付けする必要があります。

この派生識別子のサポートの強化は、実際には JPA 2.0の新しいもの の一部です(セクションを参照) JPA 2.0仕様の派生IDに対応するキー)、JPA 1.0はIdまたはOneToOneManyToOneを許可しません。 JPA 1.0では、PrimaryKeyJoinColumnを使用し、外部キー列のBasicIdマッピングを定義する必要があります。

質問は次のとおりです。@ Id + @JoinColumnは、@ PrimaryKeyJoinColumnと同じですか?

同様の結果を得ることができますが、IdまたはOneToOneManyToOneを使用すると、はるかに簡単になります JPA 2.0で派生識別子をマップします。 PrimaryKeyJoinColumnは、[〜#〜] joined [〜#〜]継承戦略で引き続き使用される場合があります。 JPA 2.0仕様の関連セクションの下:

11.1.40 PrimaryKeyJoinColumnアノテーション

PrimaryKeyJoinColumn注釈は、別のテーブルに結合するための外部キーとして使用される主キー列を指定します。

PrimaryKeyJoinColumnアノテーションは、JOINEDマッピング戦略のエンティティサブクラスのプライマリテーブルをスーパークラスのプライマリテーブルに結合するために使用されます。セカンダリテーブルをプライマリテーブルに結合するために、SecondaryTableアノテーション内で使用されます。 OneToOneマッピングで使用される場合があります。このマッピングでは、参照エンティティの主キーが、参照エンティティの外部キーとして使用されます[108]

...

JOINEDマッピング戦略のサブクラスにPrimaryKeyJoinColumn注釈が指定されていない場合、外部キー列はスーパークラスのプライマリテーブルのプライマリキー列と同じ名前を持つと想定されます。

...

例: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]セクション2.4.1.1で説明した派生IDメカニズムは、OneToOneマッピングの場合、PrimaryKeyJoinColumnよりも優先されるようになりました。

こちらもご覧ください


このソース http://weblogs.Java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state は、@ ManyToOneと@Idの使用がJPA1.x。誰が今正しい?

著者は、事前リリースJPA 2.0EclipseLinkのバージョン(記事の時点でバージョン 2.0.0-M7 )を使用して記事を書いていますJPA 1.0(!)について。この記事は誤解を招くものであり、作者はJPA 1.0の一部である[〜#〜] not [〜#〜]を使用しています。

レコードについては、IdおよびOneToOneでのManyToOneのサポートがEclipseLink 1.1に追加されました( このメッセージ from James Sutherlandを参照 、EclipseLinkコミッターおよび Java Persistence wiki bookの主な寄稿者)。しかし、これはJPA 1.0の[〜#〜] not [〜#〜]部分です。

49
Pascal Thivent

私は通常、この図を介してこれら2つを区別します。

PrimaryKeyJoinColumnを使用

enter image description here

JoinColumnを使用

enter image description here

22
GMsoF

これは古い投稿であることは知っていますが、PrimaryKeyColumnを使用する良い機会は、単方向の関係が必要な場合、またはすべてが同じIDを共有する複数のテーブルがある場合です。

一般的に、これは悪い考えであり、JoinColumnと外部キー関係を使用する方が良いでしょう。

そうは言っても、このようなシステムを使用していた古いデータベースで作業している場合は、それを使用するのがよいでしょう。

1
Philip Read