5.1 Penerangan

Dan akhirnya, strategi terakhir ialah Jadual setiap kelas. Ini bermakna jadual berasingan akan digunakan untuk setiap kelas. Dari satu segi, ini adalah MappedSuperClass yang sama, hanya dalam bentuk yang dikemas kini.

Pertama, anda perlu menggunakan anotasi:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Kelas dengan anotasi ini akan kelihatan seperti ini:


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

Dan jadual berasingan untuk setiap kelas. Sebagai contoh, ini:


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
}

Perbezaan utama ialah id laluan (PRIMARY KEY) digunakan untuk semua jadual. Anda tidak boleh mempunyai baris yang berbeza dengan id yang sama, bukan sahaja dalam jadual yang sama, tetapi juga dalam kumpulan jadual ini. Hibernate akan menguruskan perkara ini.

5.2 Contoh

Ia sangat menarik untuk melihat bagaimana ia berfungsi.

Anda boleh menulis pertanyaan HQL mudah untuk mendapatkan semua pengguna: Pengguna, Pekerja, Pelanggan :

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

Tetapi Hibernate, seterusnya, akan menghasilkan pertanyaan yang sangat menarik. Ia akan membuat pilihan daripada semua jadual, kemudian menggabungkannya melalui UNION ALL menjadi sejenis jadual maya, dan hanya kemudian ia akan mencari dan / atau memilih

Tetapi untuk menggabungkan jadual dengan lajur yang berbeza, mereka perlu ditambah dengan lajur palsu terlebih dahulu. Sebagai contoh, jadual pengguna perlu ditambah dengan lajur:

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

Contoh pertanyaan SQL kepada jadual pengguna sebelum pelaksanaan 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

Contoh pertanyaan SQL kepada jadual pekerja sebelum pelaksanaan UNION ALL:


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

Contoh pertanyaan SQL kepada jadual klien sebelum pelaksanaan 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

Berita baiknya ialah pertanyaan HQL akan berfungsi seperti yang anda mahukan.

Berita buruknya ialah mereka boleh menjadi perlahan jika terdapat banyak data dalam jadual. Kerana mula-mula anda perlu memilih data daripada semua jadual, kemudian menggabungkan barisnya dengan UNION ALL, dan kemudian menapis.