Masalah konservasi

Dina iki kita bakal duwe skema anyar lan super menarik - nggunakake fitur Hibernate kanggo nyimpen hirarki kelas menyang database.

Hierarki kelas minangka kumpulan kelas sing gegandhengan karo siji liyane kanthi hubungan warisan.

Bayangake sampeyan duwe telung kelas sing pengin disimpen ing 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 diwarisake saka saben liyane. Lan sing paling menarik yaiku sampeyan pengin nggunakake Hibernate kanggo nyimpen obyek saka kelas kasebut ing database.

Jinis solusi

Hibernate nduweni 4 cara sing bisa nggandhengake hierarki kelas karo tabel ing basis data:

  • MappedSuperclass
  • meja tunggal
  • Tabel Gabungan
  • Tabel saben kelas

Saben strategi nganggep struktur tabel dhewe ing basis data. Kadhangkala padha cukup rumit. Nanging pitakon kanggo HQL kanggo dheweke gampang banget. Iki persis ing endi kaluwihan Hibernate katon jelas.

Aku durung nate krungu istilah kasebut diterjemahake menyang basa Rusia, mula aku uga nyaranake ngucapake nganggo basa Inggris.

Ing ngisor iki kita bakal nganalisa apa tegese saben wong.

@MappedSuperClass

Ayo dadi miwiti karo solusi sing paling gampang - ing database sampeyan duwe tabel kapisah kanggo saben kelas . Contone, iki:

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
}

Mung sampeyan ngerti yen kelas kanggo tabel iki disambungake ing hirarki . Yen sampeyan pengin Hibernate uga ngerti babagan iki, sampeyan kudu nambah anotasi @MappedSuperclass menyang kelas induk . Tanpa, Hibernate mung bakal nglirwakake kolom lan anotasi kelas induk.

Kelas kanthi anotasi iki bakal katon kaya iki:

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

Iki minangka cara paling primitif kanggo ngubungake hierarki kelas lan database. Pendekatan iki mung ngidini sampeyan ngindhari lapangan duplikat ing kelas.

Pitakonan basis data ing HQL mung bakal ngasilake entitas sing jinise ditemtokake kanthi jelas. Sampeyan ora bisa nulis pitakon database ing HQL lan entuk dhaptar kabeh pangguna: Panganggo, Karyawan, Klien.