Beskrivelse
En anden strategi til lagring af et klassehierarki i en database kaldes Joined Table. Der er en særlig anmærkning til det:
@Inheritance(strategy = InheritanceType.JOINED)
Et eksempel på vores 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 bruger denne annotation, vil Hibernate forvente en separat tabel i databasen for hver klasse og dens underklasser. Når du vælger data fra dem, skal du bruge SQL JOIN-operatoren.
Eksempel på databaseskema:
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 beslutter dig for at hente data fra en klient fra tabellen, så bliver Hibernate nødt til at bruge JOIN for at deltage i tabellerne:
SELECT u.id, u.name, u.birthday, c.address FROM user u JOIN client c ON u.id = c.id;
@PrimaryKeyJoinColumn
Underordnede enhedsklasser har en kolonne i tabellen, der refererer til objekt-id'et for den overordnede enhedsklasse. Navnet på denne kolonne er som standard lig med navnet på kolonnen i den overordnede klasse.
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;
}
Så ser databasetabellen således ud:
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 tilsidesætte kolonnenavnet i afhængige tabeller, skal du bruge @PrimaryKeyJoinColumn -annotationen . 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;
}
Så ser databasetabellen således ud:
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