ホームページ >Java >&#&チュートリアル >アノテーションを使用して Hibernate 4 と Spring のエンティティ間の関係をどのように定義しますか?

アノテーションを使用して Hibernate 4 と Spring のエンティティ間の関係をどのように定義しますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 13:30:30494ブラウズ

How do you define relationships between entities in Hibernate 4 and Spring using annotations?

Hibernate 4 および Spring でリレーションシップを定義するためのアノテーションの使用

一方向の 1 対 1 のリレーションシップ

一方向のリレーションシップを作成するには-to-one 関係の場合は、所有クラスで @OneToOne アノテーションを使用します。 @JoinColumn アノテーションを構成して、依存クラスのテーブル内の外部キーを保持する列の名前を指定します。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToOne
    private Bar bar;
}

public class Bar {
    private Long barId;
    // No corresponding mapping to Foo.class
}</code>

双方向 1 対One Relationship

双方向の 1 対 1 の関係の場合、両方のクラスに @OneToOne アノテーションを付けます。所有クラスで @JoinColumn アノテーションを使用して、外部キー列名を指定します。依存クラスで、@JoinColumn アノテーションを使用して、外部キーを所有クラスにマップし直します。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "barId")
    private Bar bar;
}

public class Bar {
    private Long barId;

    @OneToOne(mappedBy = "bar")
    private Foo foo;
}</code>

ユーザーとの一方向の 1 対多の関係管理された結合テーブル

ユーザー管理の結合テーブルを使用した一方向の 1 対多の関係の場合、2 つのクラス間の関係をマップする結合テーブル クラスを作成します。結合テーブルに @Entity と @Table の注釈を付け、列を親クラスと子クラスの主キーにマップします。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany
    @JoinTable(name="FOO_BAR",
        joinColumns = @JoinColumn(name="fooId"),
        inverseJoinColumns = @JoinColumn(name="barId"))
    private List<Bar> bars;
}

public class Bar {
    private Long barId;

    // No mapping specified here.
}

@Entity
@Table(name="FOO_BAR")
public class FooBar {
    private UUID fooBarId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;

    @ManyToOne
    @JoinColumn(name = "barId")
    private Bar bar;

    // You can store other objects/fields on this table here.
}</code>

双方向 1 対多外部キー マッピングを使用した関係

外部キー マッピングを使用した双方向の 1 対多の関係の場合、所有クラスに @OneToMany のアノテーションを付け、依存クラスに @ManyToOne のアノテーションを付けます。 @JoinColumn アノテーションを使用して、依存クラス テーブル内の外部キーを保持する列名を指定します。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany(mappedBy = "bar")
    private List<Bar> bars;
}

public class Bar {
    private Long barId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;
}</code>

Hibernate を使用した双方向の多対多の関係-管理結合テーブル

Hibernate 管理の結合テーブルを使用した双方向の多対多の関係の場合、各クラスに @OneToMany アノテーションを付けます。 2 つのクラス間の関係をマップする結合テーブル クラスを作成します。結合テーブルに @Entity と @Table の注釈を付け、列を親クラスと子クラスの主キーにマップします。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany
    @JoinTable(name="FOO_BAR",
        joinColumns = @JoinColumn(name="fooId"),
        inverseJoinColumns = @JoinColumn(name="barId"))
    private List<Bar> bars;
}

public class Bar {
    private Long barId;

    @OneToMany
    @JoinTable(name="FOO_BAR",
        joinColumns = @JoinColumn(name="barId"),
        inverseJoinColumns = @JoinColumn(name="fooId"))
    private List<Foo> foos;
}</code>

双方向多対多ユーザー管理の結合テーブル オブジェクトを使用した関係

ユーザー管理の結合テーブル オブジェクトを使用した双方向の多対多の関係の場合、2 つのクラス間の関係をマップする結合テーブル クラスを作成します。結合テーブルに @Entity および @Table の注釈を付け、列を親クラスと子クラスの主キーにマップします。各クラスに @OneToMany アノテーションを付け、フィールドを結合テーブル クラスにマップします。

例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany(mappedBy = "bar")
    private List<FooBar> bars;
}

public class Bar {
    private Long barId;

    @OneToMany(mappedBy = "foo")
    private List<FooBar> foos;
}

@Entity
@Table(name="FOO_BAR")
public class FooBar {
    private UUID fooBarId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;

    @ManyToOne
    @JoinColumn(name = "barId")
    private Bar bar;

    // You can store other objects/fields on this table here.
}</code>

カスケード方向の決定

Hibernate は、どちらかまたは両方の方法で操作をカスケードできます。双方向の関係にあります。所有クラスに @OneToMany アノテーションをマークすることで、希望の方向に変更をカスケードします。一般に、関係の所有者側でカスケードをマークすることをお勧めします。

孤立したオブジェクトの削除

孤立したオブジェクトを削除すると、親オブジェクトに関連付けられなくなった孤立したオブジェクトがデータベースから自動的に削除されます。 @OneToMany アノテーションで orphanRemoval = true を設定することで、孤立の削除を有効にします。

LazyInitializationException への対処

LazyInitializationException は、遅延フェッチされたコレクションを含むエンティティが、コレクションが初期化される前にアクセスされると発生します。解決するには、Hibernate.initialize() を使用してコレクションを明示的に初期化するか、@OneToMany アノテーションで fetchType = FetchMode.EAGER を使用してコレクションを積極的にロードします。

以上がアノテーションを使用して Hibernate 4 と Spring のエンティティ間の関係をどのように定義しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。