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.
GO TO FULL VERSION