5.1 Leírás

És végül, az utolsó stratégia az osztályonkénti táblázat. Ez azt jelenti, hogy minden osztályhoz külön táblázatot kell használni. Bizonyos értelemben ez ugyanaz a MappedSuperClass, csak frissített formában.

Először egy megjegyzést kell használnia:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Az ezzel a megjegyzéssel ellátott osztályok így fognak kinézni:


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

És külön táblázatok minden osztályhoz. Például ezek:


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
}

A fő különbség az, hogy minden táblához átjelentkezési azonosítót (PRIMARY KEY) használnak. Nem lehetnek különböző sorok azonos azonosítóval, nemcsak ugyanazon a táblán belül, hanem ezen a táblacsoporton belül sem. A Hibernate gondoskodik erről.

5.2 Példák

Nagyon érdekes látni, hogyan működik mindez.

Írhat egy egyszerű HQL-lekérdezést, hogy megkapja az összes felhasználót: Felhasználó, alkalmazott, kliens :

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

A Hibernate viszont egy nagyon érdekes lekérdezést fog generálni. Kijelöl az összes táblából, majd az UNION ALL-on keresztül egyfajta virtuális táblává egyesíti, és csak ezután fog keresni és/vagy kiválasztani.

De a különböző oszlopokkal rendelkező táblázatok egyesítéséhez először hamis oszlopokkal kell kiegészíteni őket. Például a felhasználói táblát ki kell egészíteni oszlopokkal:

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

Példa egy SQL lekérdezésre a felhasználói táblához a végrehajtás előtt 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

Példa SQL lekérdezésre az alkalmazotti táblához a végrehajtás előtt UNION ALL:


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

Példa egy SQL lekérdezésre a kliens táblához a végrehajtás előtt 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

A jó hír az, hogy a HQL-lekérdezések a kívánt módon fognak működni.

A rossz hír az, hogy lassúak lehetnek, ha sok adat van a táblákban. Mert először ki kell választani az összes táblából az adatokat, majd a soraikat kombinálni a -val UNION ALL, és csak utána szűrni.