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.