Penerangan

Pendekatan seterusnya untuk menyimpan hierarki kelas adalah dengan menyimpan semua kelas dalam hierarki dalam satu jadual . Strategi ini dipanggil Jadual Tunggal .

Sebagai contoh, seperti ini:

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

Iaitu, kami mempunyai satu jadual, di mana lajur untuk semua kelas hierarki kami ditandakan dengan warna yang berbeza. Terdapat juga lajur perkhidmatan khas DTYPE VARCHAR , di mana Hibernate akan menyimpan nama kelas Entiti.

Satu-satunya perkara yang perlu dilakukan ialah menjelaskan kepada Hibernate bahawa data kelas Entiti kini disimpan dalam pangkalan data dalam satu jadual. Ini boleh dilakukan menggunakan anotasi @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Contoh kelas kami:

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

Cara data disimpan

Sekarang mari kita tulis contoh di mana kita mencipta beberapa entiti kita dan menyimpannya ke pangkalan data:

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);

Apabila menyimpan ke pangkalan data, pertanyaan SQL berikut akan dilaksanakan:

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')

Apabila menyimpan data ke jadual, Hibernate hanya menghantar medan entiti yang diketahuinya. Ini bermakna lajur yang tidak ditentukan akan menjadi NULL.

Dan ini bermakna anda tidak boleh menentukan jenis NOT NULL untuk lajur pekerjaan, kerana apabila pelanggan disimpan dalam jadual yang sama, pekerjaannya akan menjadi NULL. Ini adalah salah satu kelemahan menyimpan entiti yang berbeza dalam jadual yang sama.

Medan terakhir dalam pertanyaan SQL ialah lajur DTYPE, yang mengandungi nama kelas Entiti. Ia digunakan oleh Hibernate apabila anda ingin membaca data dari jadual anda.

Contoh:

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

Pertanyaan ini akan mengembalikan senarai semua objek jenis pengguna yang disimpan dalam pangkalan data: Pengguna, Pekerja dan Pelanggan. Berdasarkan lajur DTYPE, jenis entiti akan ditentukan dengan betul dan objek kelas yang betul akan dibuat.

Dalam kes kami, terdapat dua objek dalam senarai akaun: jenis Pekerja dan jenis Pelanggan.

peraturan HQL.