1. ホーム
  2. java

[解決済み] ORMマッピングにおける「所有する側」とは?

2022-04-25 18:53:23

質問

とは、具体的にどのようなものなのでしょうか? 所有者側 というのは?マッピング例を交えた解説とは( 一対多, 一対一, 多対一 )?

の説明から抜粋した文章です。 ワントゥーワン をJava EE 6のドキュメントに追加しました。コンセプトを見ることができます。 所有者側 を入れる。

への単一値アソシエーションを定義します。 一対一を持つ別のエンティティ の多重度です。通常 を指定する必要があります。 対象エンティティは、明示的に の型から推論されることが多い。 オブジェクトを参照する。もし の関係は双方向です。 は 非所有者側 を使用する必要があります。 OneToOneアノテーションの要素で リレーションシップフィールドまたは プロパティを持つ。

どのように解決するのですか?

なぜ、所有者側の概念が必要なのか。

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

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

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つの双方向の関係ではなく 2 別々の単方向の関係。

このマッピングでは、テーブルだけでなく PERSONSID_DOCUMENTS が、3つ目の関連テーブルも作成されます。 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は を実装するために、データベース上で単方向の(外部キー)リレーションを作成します。 双方向のオブジェクト関係

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

多くの場合、私たちが欲しいのはテーブルの外部キーだけです。 ID_DOCUMENTS に対して PERSONS であり、余分な関連付けのテーブルではありません。

これを解決するには、Hibernate を構成して、リレーション Person.idDocuments . ハイバーネートは その他 の側で、リレーション IdDocument.person を追加し、そのために マップバイ :

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

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

これは、次のような意味です: "関係のこちら側での変更は、すでに でマッピングされる。 は、リレーション IdDocument.person の反対側であるため、必要ありません。 を追加して追跡することができます。

ゴトチャはありますか、結果は?

使用方法 マップドバイ を呼び出すだけであれば person.getDocuments().add(document) の外部キーは ID_DOCUMENTS NOT は新しいドキュメントにリンクされます。これはリレーションの所有者/追跡者側ではないからです!

ドキュメントを新しい人物にリンクさせるには、明示的に document.setPerson(person) というのは、これは 所有者側 の関係です。

を使用する場合 マップドバイ の場合、所有者側が何であるかを知り、正しい側のリレーションを更新して、 データベースに新しいリレーションの永続化をトリガーするのは、開発者の責任です。