テーブルレベルの関係

2 つのテーブルをもう一度見てみましょう。

ID 名前 職業 給料 参加日
1 イワノフ・イワン プログラマー 100000 25 2012-06-30
2 ペトロフ・ペトル プログラマー 80000 23 2013-08-12
3 イワノフ・セルゲイ テスター 40000 30 2014-01-01
4 ラビノビッチ・モイシャ 監督 200000 35 2015-05-12
5 キリエンコ・アナスタシア 事務長 40000 25 2015-10-10
6 バスカ 1000 3 2018-11-11

従業員テーブル:

このテーブルには次の列があります。

  • ID INT
  • 名前VARCHAR
  • 職業VARCHA
  • 給与INT
  • 年齢INT
  • 参加日DATE

従業員のタスクを含むタスク テーブルは次のようになります。

ID 従業員ID 名前 締め切り
1 1 フロントエンドのバグを修正 2022-06-01
2 2 バックエンドのバグを修正 2022-06-15
3 5 コーヒーを買う 2022-07-01
4 5 コーヒーを買う 2022-08-01
5 5 コーヒーを買う 2022-09-01
6 (ヌル) オフィスを掃除する (ヌル)
7 4 人生を楽しむ (ヌル)
8 6 人生を楽しむ (ヌル)

このテーブルには 4 つの列しかありません。

  • idはタスク (およびテーブル内の行) の一意の番号です。
  • employee_id - タスクが割り当てられている従業員テーブルの従業員の ID。
  • name - タスクの名前と説明。
  • 期限- タスクを完了しなければならない時間。

従業員テーブルの 1 つのエントリは、タスク テーブルの多くの行から参照できます。このようなテーブルレベルの関係は、1 対多と呼ばれます。

Javaクラスレベルとの関係

そして私たちのクラスであるEmployeeクラス:

@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String name;

   @Column(name="occupation")
   public String occupation;

   @Column(name="salary")
   public Integer salary;

   @Column(name="join_date")
   public Date join;
}

元の形式のEmployeeTaskクラスは次のとおりです。

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="employee_id")
   public Integer employeeId;

   @Column(name="deadline")
   public Date deadline;
}

@OneToMany アノテーション

エンティティ クラス間の通信を別の方法で調整できます。

親クラスで子オブジェクトのコレクションを作成するために使用した@ElementCollectionアノテーションを覚えていますか? @OneToManyアノテーションを使用しても同様のことができます。今回のみ、Employeeクラスが変更されます。

@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}

@OneToManyアノテーションを使用して、オブジェクトが職員多くのEmployeeTaskオブジェクトを保存できます。また、@JoinColumnアノテーションを使用して、オブジェクト ID がタスク テーブルのどの列に格納されているかを示しました。職員

ただし、EmployeeTaskクラスには通常、employee_id 列を参照するフィールドが含まれません。例:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @Column(name="deadline")
   public Date deadline;
}

employee_id フィールドはサービス フィールドとみなされ、その値は Hibernate によって制御されます。

リクエスト例

何らかのタスクをワーカーに追加したい場合は、次のようなコードを記述する必要があります。

EmployeeTask task1 = new EmployeeTask();
task1.description = "Do Something Important";
session.persist(task1);

EmployeeTask task2 = new EmployeeTask();
task2.description = "Nothing to do";
session.persist(task2);
session.flush();

Employee director = session.find(Employee.class, 4);
director.tasks.add(task1);
director.tasks.add(task2);

session.update(director);
session.flush();

まず、2 つのEmployeeTaskオブジェクトを作成してデータベースに保存し、flush()メソッドを呼び出して、 INSERT 操作が実行され、オブジェクトに ID が割り当てられるようにします。

次に、データベース内でディレクターを見つけ、彼からタスク フィールドを取得し、彼に 2 つのタスクを追加します。次に、ディレクターをデータベースに保存します。その後、新しいタスクのデータベースのemployee_id列(従業員テーブルのディレクターのID)に値4が表示されます。

重要!データベース内のテーブルは、@ManyToOneアノテーションと@OneToManyアノテーションでも同じです。ただし、これらのテーブルの Java クラスは異なります。