Bevaringsspørgsmål

I dag vil vi have et nyt og superinteressant skema - ved at bruge Hibernate-funktionerne til at gemme klassehierarkiet i databasen.

Et klassehierarki er et sæt klasser, der er relateret til hinanden ved hjælp af et arveforhold.

Forestil dig, at du har tre klasser, som du vil gemme i databasen:

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

Klasser er arvet fra hinanden. Og det mest interessante er, at du vil bruge Hibernate for at gemme objekter af disse klasser i databasen.

Løsningstyper

Hibernate har 4 mulige måder, hvorpå det kan associere et klassehierarki med tabeller i en database:

  • Kortlagt Superklasse
  • enkelt bord
  • Tilsluttet tabel
  • Bord pr klasse

Hver strategi antager sin egen tabelstruktur i databasen. Nogle gange er de ret komplekse. Men forespørgsler om HQL til dem er meget enkle. Dette er præcis tilfældet, hvor fordelene ved Hibernate tydeligt kommer til udtryk.

Jeg har aldrig hørt disse udtryk oversat til russisk, så jeg anbefaler også at udtale dem på engelsk.

Nedenfor vil vi analysere, hvad hver af dem betyder.

@MappedSuperClass

Lad os starte med den enkleste løsning - i databasen har du separate tabeller for hver klasse . For eksempel disse:

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
}

Kun du ved , at klasserne for disse tabeller er forbundet i et hierarki . Hvis du ønsker, at Hibernate også skal vide om dette, skal du tilføje @MappedSuperclass- annotationen til forældreklassen . Uden det vil Hibernate simpelthen ignorere felterne og annoteringerne i den overordnede klasse.

Klasser med denne annotering vil se sådan ud:

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

Dette er den mest primitive måde at forbinde klassehierarkiet og databasen på. Denne tilgang giver dig faktisk kun mulighed for at undgå duplikerede felter i klasser.

Databaseforespørgsler i HQL returnerer kun den enhed, hvis type er specificeret eksplicit. Du kan ikke skrive en databaseforespørgsel i HQL og få en liste over alle brugere: Bruger, Medarbejder, Klient.