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
}
GO TO FULL VERSION