1. ホーム
  2. java

[解決済み] JPA: @JoinColumnと@PrimaryKeyJoinColumnの違い?

2023-04-28 22:11:42

質問

との正確な違いは何ですか? @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 派生した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] .

...

もし PrimaryKeyJoinColumn アノテーションが指定されていない場合、JOINED マッピング戦略でサブクラス にアノテーションが指定されていない場合、外部キーのカラムは、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の仕組み は、2.4.1.1 節で説明されるようになりました。 よりも優先されます。 PrimaryKeyJoinColumn よりも優先されるようになりました。 よりも優先されるようになりました。

こちらもご覧ください


このソース http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state は、@ManyToOneと@Idを使用するとJPA 1.xで動作すると述べています。

著者はプレリリースを使用しています JPA 2.0 に準拠したEclipseLink (バージョン 2.0.0-M7 を使用して、JPA 1.0(!)に関する記事を書いています。) この記事は誤解を招くもので、著者はあるものを使っています。 ではない の部分です。

ちなみに Id について OneToOneManyToOne は、EclipseLink 1.1 で追加されました ( このメッセージ から ジェームズ・サザーランド の主な貢献者であり、EclipseLink のコミッターでもある。 Java の永続性 wiki本の主な貢献者です)。しかし、私が主張したいのは、これは ではありません。 の一部であり、JPA 1.0ではありません。