Masalah konservasi

Hari ini kita akan memiliki skema baru dan sangat menarik - menggunakan fitur Hibernasi untuk menyimpan hierarki kelas ke database.

Sebuah hirarki kelas adalah satu set kelas yang terkait satu sama lain dengan hubungan warisan.

Bayangkan Anda memiliki tiga kelas yang ingin Anda simpan di database:

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

Kelas diwarisi dari satu sama lain. Dan yang paling menarik adalah Anda ingin menggunakan Hibernate untuk menyimpan objek dari kelas-kelas ini di database.

Jenis solusi

Hibernate memiliki 4 cara yang memungkinkan untuk mengaitkan hierarki kelas dengan tabel dalam database:

  • MappedSuperclass
  • meja tunggal
  • Tabel Gabungan
  • Tabel per kelas

Setiap strategi mengasumsikan struktur tabelnya sendiri dalam database. Terkadang mereka cukup kompleks. Tetapi permintaan HQL kepada mereka sangat sederhana. Inilah kasus di mana keunggulan Hibernate terwujud dengan jelas.

Saya belum pernah mendengar istilah-istilah ini diterjemahkan ke dalam bahasa Rusia, jadi saya juga merekomendasikan untuk mengucapkannya dalam bahasa Inggris.

Di bawah ini kami akan menganalisis apa artinya masing-masing.

@MapedSuperClass

Mari kita mulai dengan solusi paling sederhana - di database Anda memiliki tabel 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
}

Hanya Anda yang tahu bahwa kelas untuk tabel ini terhubung dalam hierarki . Jika Anda ingin Hibernate mengetahui hal ini juga, Anda perlu menambahkan anotasi @MappedSuperclass ke kelas induk . Tanpanya, Hibernasi hanya akan mengabaikan bidang dan anotasi kelas induk.

Kelas dengan anotasi ini akan terlihat seperti ini:

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

Ini adalah cara paling primitif untuk menghubungkan hierarki kelas dan database. Pendekatan ini sebenarnya hanya memungkinkan Anda untuk menghindari bidang duplikat di kelas.

Kueri basis data di HQL hanya akan mengembalikan entitas yang jenisnya ditentukan secara eksplisit. Anda tidak dapat menulis kueri basis data di HQL dan mendapatkan daftar semua pengguna: Pengguna, Karyawan, Klien.