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.