Beskrivning

En annan strategi för att lagra en klasshierarki i en databas kallas Joined Table. Det finns en speciell kommentar för det:

@Inheritance(strategy = InheritanceType.JOINED)

Ett exempel på våra 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 använder denna anteckning kommer Hibernate att förvänta sig en separat tabell i databasen för varje klass och dess underklasser. När du väljer data från dem måste du använda SQL JOIN-operatorn.

Exempel på databasschema:

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
}

Om du bestämmer dig för att hämta data från en klient från tabellen, måste Hibernate använda JOIN för att gå med i tabellerna:

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

@PrimaryKeyJoinColumn

Underordnade Entitetsklasser har en kolumn i tabellen som hänvisar till objekt-id för den överordnade Entity-klassen. Namnet på denna kolumn är som standard lika med namnet på kolumnen i den överordnade klassen.

Exempel:

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

Då ser databastabellen ut så här:

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
}

Om du vill åsidosätta kolumnnamnet i beroende tabeller måste du använda @PrimaryKeyJoinColumn -kommentaren . Exempel:

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

Då ser databastabellen ut så här:

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
}