5.1 Beschrijving

En tot slot is de laatste strategie Tabel per klas. Dit betekent dat er voor elke klas een aparte tabel wordt gebruikt. In zekere zin is dit dezelfde MappedSuperClass, alleen in een bijgewerkte vorm.

Eerst moet u een annotatie gebruiken:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Klassen met deze annotatie zien er als volgt uit:


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

En aparte tafels voor elke klas. 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
}

Het belangrijkste verschil is dat voor alle tabellen een pass-through-ID (PRIMARY KEY) wordt gebruikt. U kunt geen verschillende rijen met dezelfde id hebben, niet alleen binnen dezelfde tabel, maar ook binnen deze groep tabellen. Hibernate zal hiervoor zorgen.

5.2 Voorbeelden

Het is heel interessant om te zien hoe het allemaal werkt.

U kunt een eenvoudige HQL-query schrijven om alle gebruikers te krijgen: gebruiker, werknemer, klant :

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

Maar Hibernate zal op zijn beurt een zeer interessante vraag genereren. Hij zal een selectie maken uit alle tafels, die dan via UNION ALL combineren tot een soort virtuele tafel, en dan pas gaan zoeken en/of selecteren

Maar om tabellen met verschillende kolommen samen te voegen, moeten ze eerst worden aangevuld met valse kolommen. De gebruikerstabel moet bijvoorbeeld worden aangevuld met kolommen:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

Een voorbeeld van een SQL-query naar de gebruikerstabel vóór uitvoering UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

Een voorbeeld van een SQL-query naar de werknemerstabel vóór uitvoering UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

Een voorbeeld van een SQL-query naar de clienttabel vóór uitvoering UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

Het goede nieuws is dat HQL-query's werken zoals jij dat wilt.

Het slechte nieuws is dat ze traag kunnen zijn als er veel gegevens in de tabellen staan. Omdat u eerst gegevens uit alle tabellen moet selecteren, vervolgens hun rijen moet combineren met UNION ALLen pas daarna kunt filteren.