描述
存儲類層次結構的下一個方法是將層次結構中的所有類存儲在一個表中。這種策略稱為單表。
例如,像這樣:
CREATE TABLE user_ employee_client {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE,
address VARCHAR,
DTYPE VARCHAR
}
也就是說,我們有一個表,其中層次結構中所有類的列都用不同的顏色標記。還有一個特殊的服務列DTYPE VARCHAR,Hibernate 將在其中存儲實體類的名稱。
剩下唯一要做的就是向 Hibernate 解釋 Entity 類的數據現在存儲在數據庫中的一張表中。這可以使用@Inheritance註釋來完成:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
我們班級的一個例子:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
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;
}
數據是如何存儲的
現在讓我們寫一個例子,我們創建幾個實體並將它們保存到數據庫中:
Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);
Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);
保存到數據庫時,會執行如下SQL查詢:
INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')
INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')
將數據保存到表中時,Hibernate 僅傳遞它已知的實體字段。這意味著未指定的列將為 NULL。
這意味著您不能為職業列指定類型 NOT NULL,因為當一個客戶存儲在同一個表中時,他的職業將為 NULL。這是在同一個表中存儲不同實體的缺點之一。
SQL 查詢中的最後一個字段是 DTYPE 列,其中包含實體類的名稱。當您想從表中讀取數據時,Hibernate 會使用它。
例子:
List<User> accounts = session.createQuery("from User").list();
此查詢將返回存儲在數據庫中的所有用戶類型對象的列表:User、Employee 和 Client。根據 DTYPE 列,將正確確定實體類型並創建正確類的對象。
在我們的例子中,帳戶列表中將有兩個對象:Employee 類型和 Client 類型。
HQL 規則。
GO TO FULL VERSION