Természetvédelmi kérdések
Ma egy új és rendkívül érdekes sémánk lesz – a Hibernate szolgáltatások segítségével az osztályhierarchiát az adatbázisba menthetjük.
Az osztályhierarchia olyan osztályok halmaza, amelyek öröklődési kapcsolaton keresztül kapcsolódnak egymáshoz.
Képzelje el, hogy van három osztálya, amelyet tárolni szeretne az adatbázisban:
class User {
int id;
String name;
LocalDate birthday;
}
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
class Client extends User {
String address;
}
Az osztályok egymástól öröklődnek. És a legérdekesebb dolog az, hogy a Hibernate funkciót szeretné használni az ilyen osztályok objektumainak az adatbázisban való tárolására.
Megoldástípusok
A Hibernate 4 lehetséges módon társíthat osztályhierarchiát az adatbázisban lévő táblákhoz:
- MappedSuperclass
- egyetlen asztal
- Csatlakozott táblázat
- Osztályonkénti táblázat
Minden stratégia saját táblaszerkezetet feltételez az adatbázisban. Néha meglehetősen összetettek. De a HQL lekérdezése nagyon egyszerű. Pontosan ez az eset, amikor a Hibernate előnyei egyértelműen megmutatkoznak.
Soha nem hallottam ezeket a kifejezéseket oroszra fordítva, ezért angolul is javaslom a kiejtését.
Az alábbiakban elemezzük, mit jelentenek mindegyik.
@MappedSuperClass
Kezdjük a legegyszerűbb megoldással - az adatbázisban minden osztályhoz külön táblázatok vannak . 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
}
Csak Ön tudja, hogy ezeknek a tábláknak az osztályai hierarchiában vannak összekapcsolva . Ha azt szeretné, hogy a Hibernate is tudjon erről, hozzá kell adnia a @MappedSuperclass annotációt a szülőosztályhoz . Enélkül a Hibernate egyszerűen figyelmen kívül hagyja a szülőosztály mezőit és megjegyzéseit.
Az ezzel a megjegyzéssel ellátott osztályok így fognak kinézni:
@MappedSuperclass
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;
}
Ez a legprimitívebb módja az osztályhierarchia és az adatbázis összekapcsolásának. Ez a megközelítés valójában csak az osztályokban található ismétlődő mezők elkerülését teszi lehetővé.
A HQL adatbázis-lekérdezései csak azt az entitást adják vissza, amelynek típusa kifejezetten meg van adva. Nem írhat adatbázis-lekérdezést a HQL-ben, és nem kaphat listát az összes felhasználóról: Felhasználó, alkalmazott, ügyfél.
GO TO FULL VERSION