Tanım

Bir sınıf hiyerarşisini depolamaya yönelik bir sonraki yaklaşım, hiyerarşideki tüm sınıfları tek bir tabloda depolamaktır . Bu stratejiye Tek Tablo denir .

Örneğin, bunun gibi:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Yani, hiyerarşimizin tüm sınıflarının sütunlarının farklı renklerle işaretlendiği bir tablomuz var. Ayrıca , Hibernate'in Entity sınıfının adını saklayacağı DTYPE VARCHAR özel bir hizmet sütunu vardır .

Yapılması gereken tek şey, Hibernate'e Entity sınıflarının verilerinin artık veritabanında tek bir tabloda saklandığını açıklamaktır. Bu, @Inheritance ek açıklaması kullanılarak yapılabilir :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Sınıflarımızdan bir örnek:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
}

Veriler nasıl saklanır?

Şimdi birkaç tane varlık oluşturduğumuz ve veritabanına kaydettiğimiz bir örnek yazalım:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

Veritabanına kaydederken, aşağıdaki SQL sorgusu yürütülecektir:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

Verileri bir tabloya kaydederken, Hazırda Bekletme yalnızca kendisi tarafından bilinen varlık alanlarını iletir. Bu, belirtilmemiş sütunların NULL olacağı anlamına gelir.

Bu da, bir müşteri aynı tabloda depolandığında mesleği NULL olacağından, meslek sütunu için NOT NULL türünü belirtemeyeceğiniz anlamına gelir. Bu, farklı varlıkları aynı tabloda depolamanın dezavantajlarından biridir.

SQL sorgusundaki son alan, Entity sınıfının adını içeren DTYPE sütunudur. Tablonuzdaki verileri okumak istediğinizde Hibernate tarafından kullanılır.

Örnek:

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

Bu sorgu, veritabanında saklanan tüm kullanıcı tipi nesnelerin bir listesini döndürür: Kullanıcı, Çalışan ve İstemci. DTYPE sütununa göre varlık tipi doğru bir şekilde belirlenecek ve doğru sınıftan bir nesne oluşturulacaktır.

Bizim durumumuzda, hesaplar listesinde iki nesne olacaktır: Çalışan türü ve Müşteri türü.

HQL kuralları.