Sự miêu tả

Một chiến lược khác để lưu trữ phân cấp lớp trong cơ sở dữ liệu được gọi là Bảng đã tham gia. Có một chú thích đặc biệt cho nó:

@Inheritance(strategy = InheritanceType.JOINED)

Một ví dụ về các lớp học của chúng tôi:

@Inheritance(strategy = InheritanceType.JOINED)
@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;
}

Khi sử dụng chú thích này, Hibernate sẽ mong đợi một bảng riêng biệt trong cơ sở dữ liệu cho mỗi lớp và các lớp con của nó. Khi chọn dữ liệu từ chúng, bạn sẽ phải sử dụng toán tử THAM GIA SQL.

Ví dụ lược đồ cơ sở dữ liệu:

CREATE TABLE user {
  id INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  id INT,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  id INT,
  address VARCHAR
}

Nếu bạn quyết định lấy dữ liệu của một số máy khách từ bảng, thì Hibernate sẽ phải sử dụng THAM GIA để nối các bảng:

SELECT u.id, u.name, u.birthday, c.address FROM user u JOIN client c ON u.id = c.id;

@PrimaryKeyJoinColumn

Các lớp Thực thể con có một cột trong bảng đề cập đến id đối tượng của lớp Thực thể cha. Tên của cột này theo mặc định bằng với tên của cột của lớp cha.

Ví dụ:

@Inheritance(strategy = InheritanceType.JOINED)
@Entity
class User {
  @Id
  int user_identifier;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

Sau đó, bảng cơ sở dữ liệu sẽ trông như thế này:

CREATE TABLE user {
  user_identifier INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  user_identifier INT,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  user_identifier INT,
  address VARCHAR
}

Nếu bạn muốn ghi đè tên cột trong các bảng phụ thuộc, thì bạn cần sử dụng chú thích @PrimaryKeyJoinColumn . Ví dụ:

@Inheritance(strategy = InheritanceType.JOINED)
@Entity
class User {
  @Id
  int user_identifier;
  String name;
  LocalDate birthday;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id”)
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id2”)
class Client extends User {
   String address;
}

Sau đó, bảng cơ sở dữ liệu sẽ trông như thế này:

CREATE TABLE user {
  user_identifier INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  user_id INT,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  user_id2 INT,
  address VARCHAR
}