Описание

Еще одна стратегия хранения иерархии классов в базе данных называется 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;

@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
}
undefined
1
Задача
Модуль 4. Работа с БД, 15 уровень, 3 лекция
Недоступна
Стратегия Joined Table
Посмотри на скрипт по созданию таблиц. Создай три энтити-класса по этим таблицам, которые описывают стратегию Joined Table. Client и Employee унаследуй от Person. Расставь правильно аннотации созданным классам. Не забудь про необходимые параметры в аннотациях.