Katrangan

Pendekatan sabanjure kanggo nyimpen hirarki kelas yaiku nyimpen kabeh kelas ing hirarki ing tabel siji . Strategi iki diarani Tabel Tunggal .

Contone, kaya iki:

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

Yaiku, kita duwe tabel siji, ing ngendi kolom kanggo kabeh kelas hirarki ditandhani kanthi warna sing beda-beda. Ana uga kolom layanan khusus DTYPE VARCHAR , ing ngendi Hibernate bakal nyimpen jeneng kelas Entitas.

Siji-sijine sing kudu ditindakake yaiku nerangake marang Hibernate manawa data kelas Entitas saiki disimpen ing database ing siji tabel. Iki bisa ditindakake kanthi nggunakake anotasi @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Conto kelas kita:

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

Carane data disimpen

Saiki ayo nulis conto ing ngendi kita nggawe sawetara entitas lan simpen ing database:

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);

Nalika nyimpen ing database, query SQL ing ngisor iki bakal dieksekusi:

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')

Nalika nyimpen data menyang tabel, Hibernate mung ngliwati kolom entitas sing dikenal. Iki tegese kolom sing ora ditemtokake bakal dadi NULL.

Lan iki tegese sampeyan ora bisa nemtokake jinis NOT NULL kanggo kolom pendhudhukan, wiwit nalika klien disimpen ing meja padha, pendhudhukan bakal NULL. Iki minangka salah sawijining kekurangan kanggo nyimpen entitas sing beda ing tabel sing padha.

Kolom pungkasan ing query SQL yaiku kolom DTYPE, sing ngemot jeneng kelas Entitas. Iki digunakake dening Hibernate nalika sampeyan pengin maca data saka tabel sampeyan.

Tuladha:

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

Pitakonan iki bakal ngasilake dhaptar kabeh obyek jinis pangguna sing disimpen ing basis data: Panganggo, Karyawan, lan Klien. Adhedhasar kolom DTYPE, jinis entitas bakal ditemtokake kanthi bener lan obyek saka kelas sing bener bakal digawe.

Ing kasus kita, bakal ana rong obyek ing dhaptar akun: jinis Karyawan lan jinis Klien.

aturan HQL.