CodeGym/Java Course/All lectures for IT purposes/Un'unica tabella per l'intera gerarchia di classi

Un'unica tabella per l'intera gerarchia di classi

Disponibile

Descrizione

L'approccio successivo alla memorizzazione di una gerarchia di classi consiste nell'archiviare tutte le classi nella gerarchia in un'unica tabella . Questa strategia si chiama Single Table .

Ad esempio, in questo modo:

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

Cioè, abbiamo una tabella, in cui le colonne per tutte le classi della nostra gerarchia sono contrassegnate con colori diversi. C'è anche una colonna di servizio speciale DTYPE VARCHAR , dove Hibernate memorizzerà il nome della classe Entity.

L'unica cosa che resta da fare è spiegare a Hibernate che i dati delle classi Entity sono ora memorizzati nel database in una tabella. Questo può essere fatto usando l' annotazione @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Un esempio delle nostre classi:

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

Come vengono archiviati i dati

Ora scriviamo un esempio in cui creiamo un paio delle nostre entità e le salviamo nel database:

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);

Durante il salvataggio nel database, verrà eseguita la seguente query SQL:

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')

Quando si salvano i dati in una tabella, Hibernate gli passa solo i campi di entità noti. Ciò significa che le colonne non specificate saranno NULL.

E questo significa che non puoi specificare il tipo NOT NULL per la colonna occupazione, poiché quando un cliente è memorizzato nella stessa tabella, la sua occupazione sarà NULL. Questo è uno degli svantaggi della memorizzazione di entità diverse nella stessa tabella.

L'ultimo campo nella query SQL è la colonna DTYPE, che contiene il nome della classe Entity. Viene utilizzato da Hibernate quando si desidera leggere i dati dalla tabella.

Esempio:

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

Questa query restituirà un elenco di tutti gli oggetti di tipo utente archiviati nel database: Utente, Dipendente e Cliente. In base alla colonna DTYPE, il tipo di entità verrà determinato correttamente e verrà creato un oggetto della classe corretta.

Nel nostro caso, ci saranno due oggetti nell'elenco degli account: un tipo Dipendente e un tipo Cliente.

Regole HQL.

Commenti
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti