ORM マッピングにおける「所有側」とは何ですか? 質問する

ORM マッピングにおける「所有側」とは何ですか? 質問する

正確には所有側どういう意味ですか?マッピングの例をいくつか挙げて説明してください(1対多、1対1、多対1)?

以下の文章は、ワントゥワンJava EE 6のドキュメントでコンセプトを見ることができます所有側初期化。

1対1の多重度を持つ別のエンティティへの単一値の関連を定義します。通常は、参照されるオブジェクトのタイプから推測できるため、関連付けられたターゲットエンティティを明示的に指定する必要はありません。関係が双方向の場合、非所有側所有側の関係フィールドまたはプロパティを指定するには、OneToOne アノテーションの mapsedBy 要素を使用する必要があります。

ベストアンサー1

所有側の概念がなぜ必要なのか:

双方向関係の所有側という考え方は、リレーショナル データベースにはオブジェクトの場合のような双方向関係がないという事実から来ています。データベースには、一方向関係、つまり外部キーしかありません。

「所有側」という名前の理由は何ですか?

Hibernateによって追跡される関係の所有側は、所有するデータベース内の外部キー。

所有側の概念が解決する問題は何ですか?

マッピングされた2つのエンティティの例を見てみましょうそれなし所有側を宣言する:

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
    @ManyToOne
    private Person person;
}

OOの観点から見ると、このマッピングは1つの双方向関係を定義するのではなく、一方向の関係を分離します。

マッピングにより、テーブルとだけでなく、3 番目の関連テーブルも作成さPERSONSID_DOCUMENTSますPERSONS_ID_DOCUMENTS

CREATE TABLE PERSONS_ID_DOCUMENTS
(
  persons_id bigint NOT NULL,
  id_documents_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
  CONSTRAINT pk UNIQUE (id_documents_id)
)

主キーが のみpkであることに注意してくださいID_DOCUMENTS。この場合、Hibernate は関係の両側を独立して追跡します。つまり、関係にドキュメントを追加するとPerson.idDocuments、関連テーブルにレコードが挿入されますPERSON_ID_DOCUMENTS

一方、 を呼び出すとidDocument.setPerson(person)、テーブル の外部キー person_id が変更されますID_DOCUMENTS。Hibernate は、データベース上の一方向(外部キー)関係を実装する1つ双方向のオブジェクト関係。

所有側の概念がどのように問題を解決するか:

多くの場合、必要なのは追加の関連テーブルではなく、テーブルID_DOCUMENTSへの外部キーだけです。PERSONS

これを解決するには、リレーションの変更の追跡を停止するようにHibernateを設定する必要がありますPerson.idDocuments。Hibernateは、他の関係の側でありIdDocument.person、そのためにはマッピング:

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

mapsBy とはどういう意味ですか?

これは、「関係のこちら側での変更はすでにマップ作成者関係 IdDocument.person の反対側なので、ここで追加のテーブルで個別に追跡する必要はありません。"

GOTCHA や結果はありますか?

使用マッピングを呼び出すだけの場合、のperson.getDocuments().add(document)外部キーはID_DOCUMENTSないこれは関係の所有側/追跡側ではないため、新しいドキュメントにリンクされます。

ドキュメントを新しい人物にリンクするには、明示的に を呼び出す必要がありますdocument.setPerson(person)所有側関係の。

使用する場合マッピング所有側が何であるかを把握し、データベース内で新しい関係の永続性をトリガーするために関係の正しい側を更新するのは開発者の責任です。

おすすめ記事