Beskrivning

Nästa tillvägagångssätt för att lagra en klasshierarki är att lagra alla klasser i hierarkin i en enda tabell . Denna strategi kallas Single Table .

Till exempel, så här:

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

Det vill säga, vi har en tabell, där kolumnerna för alla klasser i vår hierarki är markerade med olika färger. Det finns också en speciell servicekolumn DTYPE VARCHAR , där Hibernate lagrar namnet på Entity-klassen.

Det enda som återstår att göra är att förklara för Hibernate att data från Entity-klasser nu lagras i databasen i en tabell. Detta kan göras med @Inheritance -anteckningen :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Ett exempel på våra 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;
}

Hur data lagras

Låt oss nu skriva ett exempel där vi skapar ett par av våra enheter och sparar 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 sparar till databasen kommer följande SQL-fråga att köras:

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 sparar data i en tabell skickar Hibernate endast entitetsfält som den känner till. Det betyder att ospecificerade kolumner blir NULL.

Och detta betyder att du inte kan ange typen NOT NULL för ockupationskolumnen, eftersom när en klient lagras i samma tabell kommer hans ockupation att vara NULL. Detta är en av nackdelarna med att lagra olika enheter i samma tabell.

Det sista fältet i SQL-frågan är kolumnen DTYPE, som innehåller namnet på Entity-klassen. Den används av Hibernate när du vill läsa data från din tabell.

Exempel:

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

Den här frågan returnerar en lista över alla objekt av användartyp som är lagrade i databasen: Användare, Anställd och Klient. Baserat på DTYPE-kolumnen kommer entitetstypen att fastställas korrekt och ett objekt av rätt klass kommer att skapas.

I vårt fall kommer det att finnas två objekt i kontolistan: en Medarbetartyp och en Kundtyp.

HQL regler.