Kwestie konserwatorskie

Dzisiaj będziemy mieli nowy i super ciekawy schemat - wykorzystanie funkcji Hibernate do zapisania hierarchii klas do bazy danych.

Hierarchia klas to zestaw klas powiązanych ze sobą relacją dziedziczenia.

Wyobraź sobie, że masz trzy klasy, które chcesz przechowywać w bazie danych:

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

Klasy są dziedziczone po sobie. A najciekawsze jest to, że chcesz użyć Hibernate do przechowywania obiektów tych klas w bazie danych.

Typy rozwiązań

Hibernate ma 4 możliwe sposoby powiązania hierarchii klas z tabelami w bazie danych:

  • ZmapowanaNadklasa
  • pojedynczy stół
  • Dołączony stół
  • Tabela na klasę

Każda strategia zakłada własną strukturę tabel w bazie danych. Czasami są one dość skomplikowane. Ale zapytania o HQL do nich są bardzo proste. Dokładnie tak jest w przypadku, gdy wyraźnie widać zalety Hibernate.

Nigdy nie słyszałem tych terminów tłumaczonych na rosyjski, dlatego też polecam wymawianie ich po angielsku.

Poniżej przeanalizujemy, co oznacza każdy z nich.

@MappedSuperClass

Zacznijmy od najprostszego rozwiązania – w bazie masz osobne tabele dla każdej klasy . Na przykład te:

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
}

Tylko Ty wiesz , że klasy dla tych tabel są połączone w hierarchię . Jeśli chcesz, aby Hibernate również o tym wiedział, musisz dodać adnotację @MappedSuperclass do klasy nadrzędnej . Bez tego Hibernate po prostu zignoruje pola i adnotacje klasy nadrzędnej.

Klasy z tą adnotacją będą wyglądać następująco:

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

Jest to najbardziej prymitywny sposób łączenia hierarchii klas i bazy danych. Takie podejście w rzeczywistości pozwala tylko uniknąć duplikatów pól w klasach.

Zapytania do bazy danych w HQL zwrócą tylko jednostkę, której typ jest określony jawnie. Nie możesz napisać zapytania do bazy danych w HQL i uzyskać listę wszystkich użytkowników: Użytkownik, Pracownik, Klient.