表級關係
讓我們再看看我們的兩個表:
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 類是不同的。
GO TO FULL VERSION