保護問題

今天我們將有一個新的超級有趣的方案——使用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 中編寫數據庫查詢並獲取所有用戶的列表:用戶、員工、客戶。