Behoud kwesties

Vandaag hebben we een nieuw en superinteressant schema: de Hibernate-functies gebruiken om de klassenhiërarchie in de database op te slaan.

Een klassenhiërarchie is een reeks klassen die aan elkaar gerelateerd zijn door een overervingsrelatie.

Stel je voor dat je drie klassen hebt die je in de database wilt opslaan:

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

Klassen zijn van elkaar geërfd. En het meest interessante is dat je Hibernate wilt gebruiken om objecten van deze klassen in de database op te slaan.

Soorten oplossingen

Hibernate heeft 4 mogelijke manieren waarop het een klassenhiërarchie kan associëren met tabellen in een database:

  • Toegewezen Superklasse
  • enkele tafel
  • Aangesloten tafel
  • Tabel per klas

Elke strategie gaat uit van een eigen tabelstructuur in de database. Soms zijn ze behoorlijk ingewikkeld. Maar query's voor HQL voor hen zijn heel eenvoudig. Dit is precies het geval waar de voordelen van Hibernate duidelijk tot uiting komen.

Ik heb deze termen nog nooit in het Russisch vertaald horen worden, dus ik raad ook aan om ze in het Engels uit te spreken.

Hieronder zullen we analyseren wat elk van hen betekent.

@MappedSuperClass

Laten we beginnen met de eenvoudigste oplossing: in de database heb je aparte tabellen voor elke klasse . Deze bijvoorbeeld:

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
}

Alleen u weet dat de klassen voor deze tabellen in een hiërarchie zijn verbonden . Als u wilt dat Hibernate hier ook van op de hoogte is, moet u de annotatie @MappedSuperclass aan de bovenliggende klasse toevoegen . Zonder dit negeert Hibernate eenvoudigweg de velden en annotaties van de bovenliggende klasse.

Klassen met deze annotatie zien er als volgt uit:

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

Dit is de meest primitieve manier om de klassenhiërarchie en de database te koppelen. Met deze aanpak kunt u eigenlijk alleen dubbele velden in klassen vermijden.

Databasequery's in HQL retourneren alleen de entiteit waarvan het type expliciet is opgegeven. U kunt geen databasequery in HQL schrijven en een lijst van alle gebruikers krijgen: gebruiker, werknemer, klant.