@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の新しいもの の一部です(セクションを参照) JPA 2.0仕様の派生IDに対応するキー)、JPA 1.0はId
またはOneToOne
でManyToOne
を許可しません。 JPA 1.0では、PrimaryKeyJoinColumn
を使用し、外部キー列のBasic
Id
マッピングを定義する必要があります。
質問は次のとおりです。@ Id + @JoinColumnは、@ PrimaryKeyJoinColumnと同じですか?
同様の結果を得ることができますが、Id
またはOneToOne
でManyToOne
を使用すると、はるかに簡単になります 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 [〜#〜]部分です。
これは古い投稿であることは知っていますが、PrimaryKeyColumn
を使用する良い機会は、単方向の関係が必要な場合、またはすべてが同じIDを共有する複数のテーブルがある場合です。
一般的に、これは悪い考えであり、JoinColumn
と外部キー関係を使用する方が良いでしょう。
そうは言っても、このようなシステムを使用していた古いデータベースで作業している場合は、それを使用するのがよいでしょう。