Mga isyu sa konserbasyon

Ngayon ay magkakaroon tayo ng bago at sobrang kawili-wiling pamamaraan - gamit ang mga tampok na Hibernate upang i-save ang hierarchy ng klase sa database.

Ang class hierarchy ay isang set ng mga klase na nauugnay sa isa't isa sa pamamagitan ng isang inheritance na relasyon.

Isipin na mayroon kang tatlong klase na gusto mong iimbak sa 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;
}

Ang mga klase ay minana sa isa't isa. At ang pinaka-kagiliw-giliw na bagay ay na nais mong gamitin ang Hibernate upang mag-imbak ng mga bagay ng mga klase sa database.

Mga uri ng solusyon

Ang hibernate ay may 4 na posibleng paraan upang maiugnay nito ang isang hierarchy ng klase sa mga talahanayan sa isang database:

  • MappedSuperclass
  • iisang mesa
  • Pinagsamang Table
  • Talahanayan bawat klase

Ipinapalagay ng bawat diskarte ang sarili nitong istraktura ng talahanayan sa database. Minsan sila ay medyo kumplikado. Ngunit ang mga query para sa HQL sa kanila ay napakasimple. Ito ay eksakto ang kaso kung saan ang mga pakinabang ng Hibernate ay malinaw na ipinakita.

Hindi ko pa narinig ang mga terminong ito na isinalin sa Russian, kaya inirerekomenda ko rin na bigkasin ang mga ito sa Ingles.

Sa ibaba ay susuriin natin kung ano ang ibig sabihin ng bawat isa sa kanila.

@MappedSuperClass

Magsimula tayo sa pinakasimpleng solusyon - sa database mayroon kang hiwalay na mga talahanayan para sa bawat klase . Halimbawa, ang mga ito:

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
}

Ikaw lang ang nakakaalam na ang mga klase para sa mga talahanayang ito ay konektado sa isang hierarchy . Kung gusto mong malaman din ito ng Hibernate, kailangan mong idagdag ang @MappedSuperclass annotation sa parent class . Kung wala ito, babalewalain ng Hibernate ang mga field at anotasyon ng parent class.

Magiging ganito ang hitsura ng mga klase na may ganitong anotasyon:

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

Ito ang pinaka primitive na paraan ng pag-uugnay sa hierarchy ng klase at database. Ang diskarteng ito ay talagang nagpapahintulot sa iyo na maiwasan ang mga duplicate na field sa mga klase.

Ang mga query sa database sa HQL ay ibabalik lamang ang entity na ang uri ay tahasang tinukoy. Hindi ka maaaring magsulat ng query sa database sa HQL at makakuha ng listahan ng lahat ng user: User, Employee, Client.