5.1 Paglalarawan

At sa wakas, ang huling diskarte ay Table bawat klase. Nangangahulugan ito na isang hiwalay na talahanayan ang gagamitin para sa bawat klase. Sa isang kahulugan, ito ay ang parehong MappedSuperClass, lamang sa isang na-update na form.

Una, kailangan mong gumamit ng anotasyon:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Magiging ganito ang hitsura ng mga klase na may ganitong anotasyon:


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

At magkahiwalay na mesa para sa bawat klase. Halimbawa, ang mga ito:


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
}

Ang pangunahing pagkakaiba ay ang isang pass-through id (PRIMARY KEY) ay ginagamit para sa lahat ng mga talahanayan. Hindi ka maaaring magkaroon ng magkakaibang mga row na may parehong id, hindi lamang sa loob ng parehong talahanayan, kundi pati na rin sa loob ng pangkat na ito ng mga talahanayan. Hibernate na ang bahala dito.

5.2 Mga Halimbawa

Napaka-interesante na makita kung paano gumagana ang lahat.

Maaari kang magsulat ng isang simpleng query sa HQL upang makuha ang lahat ng mga user: User, Employee, Client :

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

Ngunit ang Hibernate, sa turn, ay bubuo ng isang napaka-kagiliw-giliw na query. Gagawa ito ng seleksyon mula sa lahat ng mga talahanayan, pagkatapos ay pagsasamahin ito sa pamamagitan ng UNION ALL sa isang uri ng virtual na talahanayan, at pagkatapos lamang ito maghahanap at / o pipili

Ngunit para pagsamahin ang mga talahanayan na may iba't ibang column, kailangan muna nilang dagdagan ng mga pekeng column. Halimbawa, ang talahanayan ng user ay kailangang dagdagan ng mga column:

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

Isang halimbawa ng isang SQL query sa talahanayan ng gumagamit bago isagawa 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

Isang halimbawa ng SQL query sa talahanayan ng empleyado bago isagawa UNION ALL:


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

Isang halimbawa ng isang SQL query sa talahanayan ng kliyente bago isagawa 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

Ang magandang balita ay gagana ang mga query sa HQL sa paraang gusto mo.

Ang masamang balita ay maaari silang maging mabagal kung mayroong maraming data sa mga talahanayan. Dahil kailangan mo munang pumili ng data mula sa lahat ng mga talahanayan, pagkatapos ay pagsamahin ang kanilang mga hilera sa UNION ALL, at pagkatapos ay i-filter lamang.