5.1 Açıklama

Ve son olarak, son strateji Sınıf başına Tablo'dur. Yani her sınıf için ayrı bir tablo kullanılacaktır. Bir anlamda, bu aynı MappedSuperClass'tır, yalnızca güncellenmiş bir biçimdedir.

İlk olarak, bir ek açıklama kullanmanız gerekir:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Bu ek açıklamaya sahip sınıflar şöyle görünecektir:


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

Ve her sınıf için ayrı tablolar. Örneğin, bunlar:


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
}

Ana fark, tüm tablolar için doğrudan geçiş kimliğinin (PRIMARY KEY) kullanılmasıdır. Sadece aynı tablo içinde değil, bu tablo grubu içinde de aynı kimliğe sahip farklı satırlara sahip olamazsınız. Hibernate bununla ilgilenecek.

5.2 Örnekler

Her şeyin nasıl çalıştığını görmek çok ilginç.

Tüm kullanıcıları almak için basit bir HQL sorgusu yazabilirsiniz: Kullanıcı, Çalışan, Müşteri :

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

Ancak Hibernate, sırayla çok ilginç bir sorgu üretecektir. Tüm tablolardan bir seçim yapacak, ardından UNION ALL aracılığıyla bir tür sanal tablo halinde birleştirecek ve ancak o zaman arama yapacak ve / veya seçecektir.

Ancak farklı sütunlara sahip tabloları birleştirmek için öncelikle sahte sütunlarla desteklenmeleri gerekir. Örneğin, kullanıcı tablosunun sütunlarla desteklenmesi gerekir:

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

Çalıştırmadan önce kullanıcı tablosuna bir SQL sorgusu örneği 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

Çalıştırmadan önce çalışan tablosuna örnek bir SQL sorgusu UNION ALL:


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

Çalıştırmadan önce müşteri tablosuna yönelik bir SQL sorgusu örneği 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

İyi haber şu ki, HQL sorguları sizin istediğiniz gibi çalışacak.

Kötü haber şu ki, tablolarda çok fazla veri varsa yavaş olabiliyorlar. Çünkü önce tüm tablolardan veri seçmeniz, ardından satırlarını ile birleştirmeniz UNION ALLve ancak ondan sonra filtrelemeniz gerekir.