Beskrivelse

Den neste tilnærmingen til å lagre et klassehierarki er å lagre alle klassene i hierarkiet i en enkelt tabell . Denne strategien kalles Single Table .

For eksempel slik:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Det vil si at vi har én tabell, der kolonnene for alle klasser i hierarkiet vårt er merket med forskjellige farger. Det er også en spesiell tjenestekolonne DTYPE VARCHAR , der Hibernate vil lagre navnet på Entity-klassen.

Det eneste som gjenstår er å forklare Hibernate at dataene til Entity-klasser nå er lagret i databasen i én tabell. Dette kan gjøres ved å bruke @Inheritance -kommentaren :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Et eksempel på våre klasser:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
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;
}

Hvordan data lagres

La oss nå skrive et eksempel der vi lager et par av enhetene våre og lagrer dem i databasen:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

Når du lagrer til databasen, vil følgende SQL-spørring bli utført:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

Når du lagrer data i en tabell, sender Hibernate bare enhetsfelt som er kjent for den. Dette betyr at uspesifiserte kolonner vil være NULL.

Og dette betyr at du ikke kan spesifisere typen NOT NULL for okkupasjonskolonnen, siden når en klient er lagret i samme tabell, vil hans okkupasjon være NULL. Dette er en av ulempene ved å lagre forskjellige enheter i samme tabell.

Det siste feltet i SQL-spørringen er DTYPE-kolonnen, som inneholder navnet på Entity-klassen. Den brukes av Hibernate når du vil lese data fra tabellen.

Eksempel:

List<User> accounts = session.createQuery("from User").list();

Denne spørringen vil returnere en liste over alle brukertypeobjekter som er lagret i databasen: Bruker, Ansatt og Klient. Basert på DTYPE-kolonnen vil enhetstypen bli riktig bestemt og et objekt av riktig klasse vil bli opprettet.

I vårt tilfelle vil det være to objekter i kontolisten: en medarbeidertype og en klienttype.

HQL-regler.