Keterangan

Pendekatan selanjutnya untuk menyimpan hierarki kelas adalah menyimpan semua kelas dalam hierarki dalam satu tabel . Strategi ini disebut Tabel Tunggal .

Misalnya, seperti ini:

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

Yaitu, kami memiliki satu tabel, di mana kolom untuk semua kelas hierarki kami ditandai dengan warna berbeda. Ada juga kolom layanan khusus DTYPE VARCHAR , di mana Hibernate akan menyimpan nama kelas Entity.

Satu-satunya hal yang harus dilakukan adalah menjelaskan kepada Hibernate bahwa data kelas Entitas sekarang disimpan dalam database dalam satu tabel. Ini dapat dilakukan dengan 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;
}

Bagaimana data disimpan

Sekarang mari kita tulis contoh di mana kita membuat beberapa entitas kita dan menyimpannya ke 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);

Saat menyimpan ke database, kueri SQL berikut akan dijalankan:

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

Saat menyimpan data ke tabel, Hibernasi hanya meneruskan bidang entitas yang diketahuinya. Ini berarti bahwa kolom yang tidak ditentukan akan menjadi NULL.

Dan ini berarti Anda tidak dapat menentukan tipe NOT NULL untuk kolom pekerjaan, karena ketika klien disimpan dalam tabel yang sama, pekerjaannya akan menjadi NULL. Ini adalah salah satu kelemahan menyimpan entitas yang berbeda dalam tabel yang sama.

Bidang terakhir dalam kueri SQL adalah kolom DTYPE, yang berisi nama kelas Entitas. Ini digunakan oleh Hibernate saat Anda ingin membaca data dari tabel Anda.

Contoh:

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

Kueri ini akan mengembalikan daftar semua objek tipe pengguna yang disimpan dalam database: Pengguna, Karyawan, dan Klien. Berdasarkan kolom DTYPE, tipe entitas akan ditentukan dengan benar dan objek dari kelas yang benar akan dibuat.

Dalam kasus kita, akan ada dua objek dalam daftar akun: tipe Karyawan dan tipe Klien.

aturan HQL.