Bevarandefrågor

Idag kommer vi att ha ett nytt och superintressant schema - att använda Hibernate-funktionerna för att spara klasshierarkin i databasen.

En klasshierarki är en uppsättning klasser relaterade till varandra genom ett arvsförhållande.

Föreställ dig att du har tre klasser som du vill lagra 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 ärvs från varandra. Och det mest intressanta är att du vill använda Hibernate för att lagra objekt av dessa klasser i databasen.

Lösningstyper

Hibernate har fyra möjliga sätt att associera en klasshierarki med tabeller i en databas:

  • Mappad Superklass
  • enkelbord
  • Ansluten Tabell
  • Tabell per klass

Varje strategi antar sin egen tabellstruktur i databasen. Ibland är de ganska komplicerade. Men frågor om HQL till dem är mycket enkla. Detta är exakt fallet där fördelarna med Hibernate tydligt manifesteras.

Jag har aldrig hört dessa termer översatta till ryska, så jag rekommenderar också att du uttalar dem på engelska.

Nedan kommer vi att analysera vad var och en av dem betyder.

@MappedSuperClass

Låt oss börja med den enklaste lösningen - i databasen har du separata tabeller för varje klass . Till exempel dessa:

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
}

Bara du vet att klasserna för dessa tabeller är sammankopplade i en hierarki . Om du vill att Hibernate ska veta om detta också, måste du lägga till @MappedSuperclass -kommentaren till den överordnade klassen . Utan det kommer Hibernate helt enkelt att ignorera fälten och anteckningarna för den överordnade klassen.

Klasser med denna kommentar kommer att se ut så här:

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

Detta är det mest primitiva sättet att länka samman klasshierarkin och databasen. Detta tillvägagångssätt låter dig faktiskt bara undvika dubbletter av fält i klasser.

Databasfrågor i HQL returnerar endast den enhet vars typ anges explicit. Du kan inte skriva en databasfråga i HQL och få en lista över alla användare: Användare, Anställd, Klient.