Paglalarawan

Ang isa pang diskarte para sa pag-iimbak ng isang hierarchy ng klase sa isang database ay tinatawag na Joined Table. Mayroong espesyal na anotasyon para dito:

@Inheritance(strategy = InheritanceType.JOINED)

Isang halimbawa ng aming mga klase:

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

Kapag ginagamit ang anotasyong ito, aasahan ng Hibernate ang isang hiwalay na talahanayan sa database para sa bawat klase at mga subclass nito. Kapag pumipili ng data mula sa kanila, kakailanganin mong gamitin ang operator ng SQL JOIN.

Halimbawa ng schema ng database:

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
}

Kung magpasya kang kunin ang data ng ilang kliyente mula sa talahanayan, ang Hibernate ay kailangang gumamit ng JOIN upang sumali sa mga talahanayan:

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

@PrimaryKeyJoinColumn

Ang mga klase ng Child Entity ay may column sa talahanayan na tumutukoy sa object id ng parent Entity class. Ang pangalan ng column na ito ay bilang default na katumbas ng pangalan ng column ng parent class.

Halimbawa:

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

Pagkatapos ang talahanayan ng database ay magiging ganito:

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
}

Kung gusto mong i-override ang pangalan ng column sa mga dependent table, kailangan mong gamitin ang @PrimaryKeyJoinColumn annotation . Halimbawa:

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

Pagkatapos ang talahanayan ng database ay magiging ganito:

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
}