Beskrivelse

En annen strategi for å lagre et klassehierarki i en database kalles Joined Table. Det er en spesiell merknad for det:

@Inheritance(strategy = InheritanceType.JOINED)

Et eksempel på våre klasser:

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

Når du bruker denne merknaden, vil Hibernate forvente en separat tabell i databasen for hver klasse og dens underklasser. Når du velger data fra dem, må du bruke SQL JOIN-operatoren.

Eksempel på databaseskjema:

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
}

Hvis du bestemmer deg for å hente dataene til en klient fra tabellen, må Hibernate bruke JOIN for å bli med i tabellene:

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

@PrimaryKeyJoinColumn

Underordnede enhetsklasser har en kolonne i tabellen som refererer til objekt-ID-en til den overordnede enhetsklassen. Navnet på denne kolonnen er som standard lik navnet på kolonnen til den overordnede klassen.

Eksempel:

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

Da vil databasetabellen se slik ut:

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
}

Hvis du vil overstyre kolonnenavnet i avhengige tabeller, må du bruke @PrimaryKeyJoinColumn -kommentaren . Eksempel:

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

Da vil databasetabellen se slik ut:

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
}