JPA:@JoinColumnと@PrimaryKeyJoinColumnの違いは?


83

間の正確な違いは何だ@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ためにありますか?

回答:


55

列をPK(別名識別関係)にも昇格させるとどうなりますか?列がPKになっているので、@ Id(...)でタグ付けする必要があります。

派生識別子のこの強化されたサポートは、実際にはJPA 2.0の新しい機能の一部です(セクション2.4.1 JPA 2.0仕様の派生識別子に対応する主キーを参照)。JPA1.0ではIdOneToOneまたはを使用できませんManyToOne。JPA 1.0では、外部キー列のマッピングを使用PrimaryKeyJoinColumnおよび定義する必要がありBasic Idます。

ここで問題は、@ Id + @JoinColumnは@PrimaryKeyJoinColumnと同じですか?

同様の結果を得ることができますが、IdonOneToOneまたはを使用する方ManyToOneはるかに簡単であり、派生識別子をJPA2.0にマップするための推奨される方法です。JOINED継承戦略PrimaryKeyJoinColumnで引き続き使用される可能性があります。JPA 2.0仕様の関連セクションの下:

11.1.40PrimaryKeyJoinColumnアノテーション

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

PrimaryKeyJoinColumn注釈は、中実体サブクラスのプライマリ・テーブルに参加するために使用されるJOINED 、そのスーパークラスのプライマリ・テーブルへのマッピング戦略を、SecondaryTableアノテーション内でセカンダリテーブルをプライマリテーブルに結合するために使用され ます。また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]セクション2.4.1.1で説明されている派生IDメカニズムはPrimaryKeyJoinColumn、OneToOneマッピングの場合よりも優先され ます。

も参照してください


このソースhttp://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-stateは、@ ManyToOneと@Idの使用がJPA1.xで機能すると述べています。今誰が正しいですか?

著者は、プレリリースのJPA 2.0準拠バージョンのEclipseLink(記事の時点ではバージョン2.0.0-M7)を使用して、JPA 1.0(!)に関する記事を書いています。この記事は誤解を招く恐れがあります。作成者はJPA1.0の一部ではないものを使用しています。

レコードのサポートのためIdOneToOneManyToOneのEclipseLink 1.1で追加されている(このメッセージからジェームズ・サザーランド、のEclipseLinkコミッタとの主な要因れるJava Persistenceウィキ本を)。ただし、これはJPA1.0の一部ではないことを主張しておきます。


このソース weblogs.java.net/blog/felipegaucho/archive/2009/10/24/… は、@ ManyToOneと@Idの使用がJPA1.xで機能すると述べています。今誰が正しいですか?
kawu 2010

OK。それを片付けてくれてありがとう。参照されている悪い例が@IdClassを誤って使用しているのは正しいですか?@Idアノテーションは、エンティティクラスの個別の(冗長/重複)列に正しく配置する必要がありますか?(@IdClassの使用はもう推奨されないことはわかっていますが)
Kawu 2010

つまり、クラスには2つのプロパティが必要です。@ Id @Column private Stringstitution; および@ Id @ Columnプライベート文字列の競合。PKを指定するだけですか?
kawu 2010

@Kawu申し訳ありませんが、正直なところ、小さなコメントボックスでこれを議論するのは難しすぎます。あなたが何を話しているのか理解できませんでした。別の特定の質問がある場合は、JPA実装を選択して少し実験するか、完全な例(およびJPAバージョン)を使用して新しい質問を投稿することをお勧めします。これは物事をはるかに簡単にします。
Pascal Thivent 2010

38

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

使用する PrimaryKeyJoinColumn

ここに画像の説明を入力してください

使用する JoinColumn

ここに画像の説明を入力してください


3
@yusher、PrimaryKeyJoinColumn同じ主キー値を使用して2つのテーブルを結合するとJoinColumn、メインテーブルの主キーが別のテーブルの外部キーになります。
サムYC19年

2

これは古い投稿PrimaryKeyColumnですが、単方向の関係が必要な場合や、複数のテーブルがすべて同じIDを共有している場合に使用するのが適切です。

一般に、これは悪い考えであり、との外部キー関係を使用することをお勧めしJoinColumnます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.