Articles

Hibernate One to Many Annotation Tutorial

Introduction

この簡単なHibernateチュートリアルでは、XMLの代替であるJPAアノテーションを使用した一対多マッピングの例を紹介します。また、双方向の関係とは何か、それらがどのように矛盾を生み出すことができるか、そして所有権の考え方がどのように役立つかを学びます。hibernateを使用したSpring Boot

Spring BootとHibernate/JPAを統合するための簡単で実用的なイントロ。

続きを読む→

Hibernate/JPAの識別子の概要

hibernateでエンティティ識別子をマップする方法を学びます。簡単に言えば、1対多マッピングとは、テーブル内の1つの行が別のテーブル内の複数の行にマッピングされることを意味します。

次のエンティティ関係図を見て、一対多の関連付けを見てみましょう。

この例では、各カート用のテーブルと各アイテム用の別のテーブル 一つのカートには多くのアイテムを持つことができるので、ここでは一対多のマッピングがあります。これがデータベースレベルで機能する方法は、cartテーブルの主キーとしてcart_idを持ち、itemsの外部キーとしてcart_idを持っていることです。コードでそれを行う方法は@OneToManyを使用することです。

データベース内の関係を反映する方法で、CartクラスをItemsオブジェクトにマップしましょう。

public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; //...}

@ManyToOneを使用してItemsにCartへの参照を追加することもでき、これを双方向の関係にすることができます。 双方向とは、カートからアイテムにアクセスできることを意味し、アイテムからもカートにアクセスできます。mappedByプロパティは、子クラスの親クラスを表すために使用している変数をHibernateに伝えるために使用するものです。

一対多の関連付けを実装するサンプルHibernateアプリケーションを開発するために、次のテクノロジとライブラリが使用されています。

  • JDK1.8以降
  • Hibernate5
  • Maven3以降
  • H2database

Setup

3.1。 データベース設定

以下は、カートとアイテムのテーブルのための私たちのデータベーススクリプトです。 一対多のマッピングにforeign key制約を使用します。

データベースのセットアップの準備ができているので、Hibernateサンプルプロジェクトの作成に移りましょう。3.2.

3.2. 次に、HibernateとH2ドライバの依存関係をpomに追加します。xmlファイル。 Hibernateの依存関係はJBossロギングを使用し、推移的な依存関係として自動的に追加されます:

  • Hibernateバージョン5.2.7。ファイナル
  • H2ドライバのバージョン1.4。197

Hibernateの最新バージョンとH2依存関係については、Maven centralリポジトリを参照してください。

3.3. Hibernateの設定

Hibernateの設定は次のとおりです。

3.4。 HibernateAnnotationUtilクラス

HibernateAnnotationUtilクラスでは、新しいHibernate設定ファイルを参照するだけです。

モデル

マッピング関連の設定は、モデルクラスのJPAアノテ:@OneToManyアノテーションは、mappedBy変数のマップに使用されるItemsクラスのプロパティを定義するために使用されることに注意してください。 そのため、Itemsクラスに”cart”という名前のプロパティがあります。

@ManyToOne注釈がCartクラス変数に関連付けられていることに注意することも重要です。 @JoinColumnアノテーションは、マップされた列を参照します。

In Action

テストプログラムでは、hibernateセッションを取得するためのmain()メソッドを持つクラスを作成し、モデルオブジェクトを一対多の関連付けを実@manytooneアノテーションを使用して一つの関係を作成します。 多対一マッピングとは、このエンティティの多くのインスタンスが別のエンティティの1つのインスタンスにマッピングされることを意味します–1つのカート内の多くのアイテム。

@ManyToOneアノテーションを使用すると、双方向の関係も作成できます。 私たちは、次のいくつかのサブセクションで詳細にこれをカバーします。

6.1. 不整合と所有権

ここで、Cartがアイテムを参照していたが、アイテムがCartを参照していなかった場合、関係は単方向になります。 オブジェクトも自然な一貫性を持っています。しかし、私たちの場合、関係は双方向であり、矛盾の可能性をもたらします。

開発者がitem1をcartに、item2をcart2に追加したいが、cart2とitem2の間の参照が矛盾するように間違っている状況を想像してみましょう。

上に示したように、item2はcart2を参照しているのに対し、cart2はitem2を参照していないので、それは悪いことです。

hibernateはitem2をデータベースにどのように保存する必要がありますか? Item2外部キーはcart1またはcart2を参照しますか?

私たちは、関係の所有側のアイデアを使用して、このあいまいさを解決します。6.2.

所有側としての項目

セクション2.9の下のJPA仕様で述べられているように、所有側として多対一の側をマークすることをお勧めします。つまり、アイテムは所有側になり、逆側にカートします。では、どうやってこれを達成しましたか?

mappedBy属性をCartクラスに含めることによって、それを逆側としてマークします。

同時に、項目にも注釈を付けます。アイテムを所有する側にする@ManyToOneとカートフィールド。

私たちの”矛盾”の例に戻って、Hibernateはitem2の参照がより重要であることを知っており、item2の参照をデータベースに保存します。

結果を確認しましょう:

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2

cartはスニペットでitem2を参照していますが、item2のcart2への参照はデータベースに保存されます。6.3.

所有側としてカート

一対多側を所有側としてマークし、多対一側を逆側としてマークすることもできます。これは推奨される方法ではありませんが、先に進んで試してみましょう。

これは推奨される方法ではありません。

以下のコードスニペットは、所有側としての一対多側の実装を示しています。

mappedBy要素を削除し、many-to-one@JoinColumnをinsertable、updatableをfalseに設定する方法に注意してください。同じコードを実行すると、結果は反対になります。

item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1

上記のように、item2はcartに属します。

結論

JPAアノテーションを使用して、Hibernate ORMおよびH2データベースとの一対多の関係を実装するのがいかに簡単かを見てきました。さらに、双方向の関係と、所有側の概念を実装する方法について学びました。