Описание

Друга стратегия за съхраняване на йерархия на класове в база данни се нарича 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 ще очаква отделна table в базата данни за всеки клас и неговите подкласове. Когато избирате данни от тях, ще трябва да използвате оператора 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
}

Ако решите да получите данните на някой клиент от tableта, тогава Hibernate ще трябва да използва JOIN, за да се присъедини към таблиците:

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

@PrimaryKeyJoinColumn

Класовете дъщерни обекти имат колона в tableта, която препраща към идентификатора на обекта на родителския клас обект. Името на тази колона по подразбиране е равно на името на колоната на родителския клас.

Пример:

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

Тогава tableта на базата данни ще изглежда така:

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

Тогава tableта на базата данни ще изглежда така:

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
}