Problemi di conservazione
Oggi avremo uno schema nuovo e super interessante: utilizzare le funzionalità di Hibernate per salvare la gerarchia di classi nel database.
Una gerarchia di classi è un insieme di classi correlate tra loro da una relazione di ereditarietà.
Immagina di avere tre classi che desideri archiviare nel 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;
}
Le classi vengono ereditate l'una dall'altra. E la cosa più interessante è che vuoi usare Hibernate per memorizzare oggetti di queste classi nel database.
Tipi di soluzione
Hibernate ha 4 modi possibili per associare una gerarchia di classi alle tabelle in un database:
- MappedSuperclass
- tavolo unico
- Tavolo Unito
- Tabella per classe
Ogni strategia presuppone la propria struttura di tabella nel database. A volte sono piuttosto complessi. Ma le query per HQL per loro sono molto semplici. Questo è esattamente il caso in cui i vantaggi di Hibernate si manifestano chiaramente.
Non ho mai sentito questi termini tradotti in russo, quindi consiglio di pronunciarli anche in inglese.
Di seguito analizzeremo cosa significa ciascuno di essi.
@MappedSuperClass
Cominciamo con la soluzione più semplice: nel database hai tabelle separate per ogni classe . Ad esempio, questi:
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
}
Solo tu sai che le classi per queste tabelle sono collegate in una gerarchia . Se vuoi che anche Hibernate lo sappia, devi aggiungere l' annotazione @MappedSuperclass alla classe genitore . Senza di esso, Hibernate ignorerà semplicemente i campi e le annotazioni della classe genitore.
Le classi con questa annotazione avranno questo aspetto:
@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;
}
Questo è il modo più primitivo di collegare la gerarchia di classi e il database. Questo approccio in realtà ti consente solo di evitare campi duplicati nelle classi.
Le query del database in HQL restituiranno solo l'entità il cui tipo è specificato in modo esplicito. Non è possibile scrivere una query di database in HQL e ottenere un elenco di tutti gli utenti: Utente, Impiegato, Cliente.