Isu pemuliharaan

Hari ini kita akan mempunyai skema baharu dan sangat menarik - menggunakan ciri Hibernate untuk menyimpan hierarki kelas ke pangkalan data.

Hierarki kelas ialah satu set kelas yang berkaitan antara satu sama lain melalui hubungan warisan.

Bayangkan anda mempunyai tiga kelas yang anda ingin simpan dalam pangkalan data:

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 antara satu sama lain. Dan perkara yang paling menarik ialah anda ingin menggunakan Hibernate untuk menyimpan objek kelas ini dalam pangkalan data.

Jenis penyelesaian

Hibernate mempunyai 4 kemungkinan cara ia boleh mengaitkan hierarki kelas dengan jadual dalam pangkalan data:

  • MappedSuperclass
  • meja tunggal
  • Jadual Bergabung
  • Jadual setiap kelas

Setiap strategi menganggap struktur jadualnya sendiri dalam pangkalan data. Kadang-kadang mereka agak kompleks. Tetapi pertanyaan untuk HQL kepada mereka adalah sangat mudah. Ini betul-betul kes di mana kelebihan Hibernate jelas ditunjukkan.

Saya tidak pernah mendengar istilah ini diterjemahkan ke dalam bahasa Rusia, jadi saya juga mengesyorkan untuk menyebutnya dalam bahasa Inggeris.

Di bawah ini kita akan menganalisis maksud setiap daripada mereka.

@MappedSuperClass

Mari kita mulakan dengan penyelesaian paling mudah - dalam pangkalan data anda mempunyai jadual berasingan untuk setiap kelas . Sebagai contoh, 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 bahawa kelas untuk jadual ini disambungkan dalam hierarki . Jika anda mahu Hibernate mengetahui tentang perkara ini juga, anda perlu menambah anotasi @MappedSuperclass pada kelas induk . Tanpa itu, Hibernate hanya akan mengabaikan medan dan anotasi kelas induk.

Kelas dengan anotasi ini akan kelihatan 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 memautkan hierarki kelas dan pangkalan data. Pendekatan ini sebenarnya hanya membenarkan anda mengelakkan medan pendua dalam kelas.

Pertanyaan pangkalan data dalam HQL akan mengembalikan hanya entiti yang jenisnya dinyatakan secara eksplisit. Anda tidak boleh menulis pertanyaan pangkalan data dalam HQL dan mendapatkan senarai semua pengguna: Pengguna, Pekerja, Pelanggan.