Paglalarawan

Ang susunod na diskarte sa pag-iimbak ng isang hierarchy ng klase ay ang pag-imbak ng lahat ng mga klase sa hierarchy sa isang talahanayan . Ang diskarteng ito ay tinatawag na Single Table .

Halimbawa, tulad nito:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Iyon ay, mayroon kaming isang talahanayan, kung saan ang mga haligi para sa lahat ng mga klase ng aming hierarchy ay minarkahan ng iba't ibang kulay. Mayroon ding espesyal na column ng serbisyo DTYPE VARCHAR , kung saan iimbak ng Hibernate ang pangalan ng klase ng Entity.

Ang tanging bagay na natitira upang gawin ay ipaliwanag sa Hibernate na ang data ng mga klase ng Entity ay naka-imbak na ngayon sa database sa isang talahanayan. Magagawa ito gamit ang @Inheritance annotation :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Isang halimbawa ng aming mga klase:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
}

Paano iniimbak ang data

Ngayon magsulat tayo ng isang halimbawa kung saan gumawa tayo ng ilan sa ating mga entity at i-save ang mga ito sa database:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

Kapag nagse-save sa database, ang sumusunod na query sa SQL ay isasagawa:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

Kapag nagse-save ng data sa isang talahanayan, ang Hibernate ay nagpapasa lamang ng mga field ng entity na kilala nito. Nangangahulugan ito na ang mga hindi natukoy na column ay magiging NULL.

At nangangahulugan ito na hindi mo maaaring tukuyin ang uri na HINDI NULL para sa hanay ng trabaho, dahil kapag ang isang kliyente ay naka-imbak sa parehong talahanayan, ang kanyang trabaho ay magiging NULL. Ito ay isa sa mga disadvantages ng pag-iimbak ng iba't ibang mga entity sa parehong talahanayan.

Ang huling field sa SQL query ay ang DTYPE column, na naglalaman ng pangalan ng Entity class. Ito ay ginagamit ng Hibernate kapag gusto mong basahin ang data mula sa iyong talahanayan.

Halimbawa:

List<User> accounts = session.createQuery("from User").list();

Ang query na ito ay magbabalik ng isang listahan ng lahat ng mga bagay na uri ng user na nakaimbak sa database: User, Empleyado, at Client. Batay sa column ng DTYPE, ang uri ng entity ay matutukoy nang tama at isang bagay na may tamang klase ang gagawin.

Sa aming kaso, magkakaroon ng dalawang bagay sa listahan ng mga account: isang uri ng empleyado at isang uri ng Kliyente.

Mga panuntunan ng HQL.