表級關係

讓我們再看看我們的兩個表:

ID 姓名 職業 薪水 年齡 加入日期
1個 伊万諾夫伊万 程序員 100000 25 2012-06-30
2個 彼得羅夫彼得 程序員 80000 23 2013-08-12
3個 伊万諾夫謝爾蓋 測試儀 40000 三十 2014-01-01
4個 拉比諾維奇·莫伊沙 導演 200000 35 2015-05-12
5個 基連科阿納斯塔西婭 辦公室主管 40000 25 2015-10-10
6個 瓦斯卡 1000 3個 2018-11-11

員工表:

該表包含以下列:

  • 標識符整數
  • 名稱VARCHAR
  • 職業VARCHA
  • 薪水整數
  • 年齡整數
  • join_date日期

這就是包含員工任務的任務表的樣子:

ID emploee_id 姓名 最後期限
1個 1個 修復一個前端bug 2022-06-01
2個 2個 修復後端的一個bug 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。
  • 名稱- 任務的名稱和描述。
  • deadline - 任務必須完成的時間。

任務表中的多行可以引用員工表中的單個條目。這種表級關係稱為一對多

與 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 annotation可以完成類似的事情。只有這一次,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 控制。

請求示例

如果你想給某個 worker 添加一些任務,那麼你需要編寫如下代碼:

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();

首先我們創建兩個EmployeeTask對象,保存到數據庫中,調用flush()方法,進行INSERT操作,對像有ID。

然後我們在數據庫中找到director,從他那裡取出tasks字段,給他添加兩個task。然後我們將導演保存到數據庫中。之後,值 4 將出現在數據庫中的 employee_id 列中的新任務 - 員工表中主管的 ID。

重要的!數據庫中的表對於@ManyToOne@OneToMany註釋是相同的。但是這些表的 Java 類是不同的。