89

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

4

3 に答える 3

56

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

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

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

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

11.1.40PrimaryKeyJoinColumnアノテーション

注釈は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メカニズムは 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の一部ではないものを使用しています。

Id記録のために、オンOneToOneのサポートがManyToOneEclipseLink 1.1に追加されました( EclipseLinkコミッターでJava Persistencewikiブックの主な寄稿者であるJamesSutherlandからこのメッセージを参照してください)。ただし、これはJPA1.0の一部ではありません。

于 2010-08-05T20:43:18.693 に答える
45

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

使用するPrimaryKeyJoinColumn

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

使用するJoinColumn

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

于 2018-02-14T03:29:57.843 に答える
2

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

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

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

于 2019-08-28T15:54:09.940 に答える