1. Опис

Ще одна стратегія зберігання ієрархії класів у базі даних називається Joined Table. Для неї є спеціальна анотація:


@Inheritance(strategy = InheritanceType.JOINED)

Приклад наших класів:


@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;
}

При використанні цієї анотації Hibernate чекатиме в базі на окрему таблицю для кожного класу та його підкласів. Під час вибірки даних із них доведеться використовувати SQL-оператор JOIN.

Приклад схеми бази даних:


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
}

Якщо ти вирішиш отримати з таблиці дані якогось клієнта, Hibernate доведеться використовувати JOIN для об'єднання таблиць:

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

2. @PrimaryKeyJoinColumn

Дочірні Entity-класи мають колонку в таблиці, яка посилається на id об'єкта батьківського Entity-класу. Ім'я цієї колонки за замовчуванням дорівнює імені колонки батьківського класу.

Приклад:


@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;
}

Тоді у базі таблиці виглядатимуть так:


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
}

Якщо ти хочеш перевизначити ім'я колонки в залежних таблицях, то тобі потрібно використати анотацію @PrimaryKeyJoinColumn. Приклад:


@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;
}

Тоді у базі таблиці виглядатимуть так:


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
}