保護問題
今天我們將有一個新的超級有趣的方案——使用Hibernate特性將類層次結構保存到數據庫中。
類層次結構是一組通過繼承關係相互關聯的類。
假設您要將三個類存儲在數據庫中:
class User {
int id;
String name;
LocalDate birthday;
}
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
class Client extends User {
String address;
}
類是相互繼承的。最有趣的是,您想使用 Hibernate 來將這些類的對象存儲在數據庫中。
解決方案類型
Hibernate 有 4 種可能的方式可以將類層次結構與數據庫中的表相關聯:
- 映射超類
- 單表
- 連接表
- 每班表
每個策略在數據庫中都採用自己的表結構。有時它們非常複雜。但是向他們查詢 HQL 非常簡單。這也正是Hibernate的優勢體現的淋漓盡致的地方。
我從未聽說過將這些術語翻譯成俄語,所以我也建議用英語發音。
下面我們就來分析一下它們各自的意思。
@MappedSuperClass
讓我們從最簡單的解決方案開始——在數據庫中,每個類都有單獨的表。例如,這些:
CREATE TABLE user {
id INT,
name VARCHAR,
birthday DATE
}
CREATE TABLE employee {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE
}
CREATE TABLE client {
id INT,
name VARCHAR,
birthday DATE,
address VARCHAR
}
只有您知道這些表的類在層次結構中相連。如果你想讓 Hibernate 也知道這一點,你需要在父類中添加@MappedSuperclass註解。沒有它,Hibernate 將簡單地忽略父類的字段和註釋。
帶有此註釋的類將如下所示:
@MappedSuperclass
class User {
int id;
String name;
LocalDate birthday;
}
@Entity
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
@Entity
class Client extends User {
String address;
}
這是連接類層次結構和數據庫的最原始的方式。這種方法實際上只允許您避免類中的重複字段。
HQL 中的數據庫查詢只會返回明確指定類型的實體。您不能在 HQL 中編寫數據庫查詢並獲取所有用戶的列表:用戶、員工、客戶。
GO TO FULL VERSION