Leírás

Egy másik stratégia az osztályhierarchia adatbázisban való tárolására a Joined Table. Van hozzá egy speciális megjegyzés:

@Inheritance(strategy = InheritanceType.JOINED)

Példa az osztályainkra:

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

Ennek a megjegyzésnek a használatakor a Hibernate külön táblázatot vár az adatbázisban minden osztályhoz és alosztályaihoz. Az adatok kiválasztásakor az SQL JOIN operátort kell használnia.

Adatbázisséma példa:

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
}

Ha úgy dönt, hogy valamelyik kliens adatait lekéri a táblából, akkor a Hibernate-nek a JOIN-t kell használnia a táblák összekapcsolásához:

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

@PrimaryKeyJoinColumn

A Child Entity osztályoknak van egy oszlopa a táblázatban, amely a szülő Entity osztály objektumazonosítójára hivatkozik. Ennek az oszlopnak a neve alapértelmezés szerint megegyezik a szülőosztály oszlopának nevével.

Példa:

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

Ekkor az adatbázistábla így fog kinézni:

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
}

Ha felül szeretné írni az oszlop nevét a függő táblákban, akkor a @PrimaryKeyJoinColumn megjegyzést kell használnia . Példa:

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

Ekkor az adatbázistábla így fog kinézni:

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
}