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.