5.1 Deskripsi

Dan terakhir, strategi terakhir adalah Tabel per kelas. Ini berarti tabel terpisah akan digunakan untuk setiap kelas. Dalam arti tertentu, ini adalah MappedSuperClass yang sama, hanya dalam bentuk yang diperbarui.

Pertama, Anda perlu menggunakan anotasi:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Kelas dengan anotasi ini akan terlihat seperti ini:


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

Dan meja terpisah untuk setiap kelas. Misalnya, ini:


CREATE TABLE user {
	id INT,
	name VARCHAR,
	birthday DATE
}

CREATE TABLE employee {
	id INT,
	name VARCHAR,
	birthday DATE,
	occupation VARCHAR,
	salary INT,
	join DATE
}

CREATE TABLE client {
	id INT,
	name VARCHAR,
	birthday DATE,
	address VARCHAR
}

Perbedaan utama adalah bahwa pass-through id (PRIMARY KEY) digunakan untuk semua tabel. Anda tidak dapat memiliki baris berbeda dengan id yang sama, tidak hanya di dalam tabel yang sama, tetapi juga di dalam grup tabel ini. Hibernasi akan menangani ini.

5.2 Contoh

Sangat menarik untuk melihat bagaimana semuanya bekerja.

Anda dapat menulis kueri HQL sederhana untuk mendapatkan semua pengguna: Pengguna, Karyawan, Klien :

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

Tapi Hibernasi, pada gilirannya, akan menghasilkan kueri yang sangat menarik. Itu akan membuat pilihan dari semua tabel, kemudian menggabungkannya melalui UNION ALL menjadi semacam tabel virtual, dan baru kemudian akan mencari dan / atau memilih

Tetapi untuk menggabungkan tabel dengan kolom yang berbeda, tabel tersebut harus dilengkapi dengan kolom palsu terlebih dahulu. Misalnya, tabel pengguna perlu dilengkapi dengan kolom:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

Contoh kueri SQL ke tabel pengguna sebelum dieksekusi UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

Contoh kueri SQL ke tabel karyawan sebelum dieksekusi UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

Contoh kueri SQL ke tabel klien sebelum dieksekusi UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

Kabar baiknya adalah kueri HQL akan berfungsi seperti yang Anda inginkan.

Kabar buruknya adalah mereka bisa lambat jika ada banyak data di tabel. Karena pertama-tama Anda perlu memilih data dari semua tabel, lalu menggabungkan barisnya dengan UNION ALL, dan baru memfilter.