Опис
Ще одна стратегія зберігання ієрархії класів у базі даних називається 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
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ