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.
GO TO FULL VERSION