Keterangan

Pada pelajaran sebelumnya, Anda melihat bahwa Hibernate menggunakan kolom DTYPE VARCHAR khusus untuk menyimpan nama kelas Entity. Kolom seperti itu disebut diskriminator . Ini digunakan untuk menentukan kelas mana yang akan dibuat untuk baris tertentu dalam database.

Anda dapat memanipulasi kolom ini dengan anotasi @DiscriminatorColumn . Contoh:

@DiscriminatorColumn(name="column_name",   discriminatorType = DiscriminatorType.INTEGER)

Menurut spesifikasi JPA, diskriminator dapat memiliki tipe berikut:

  • RANGKAIAN
  • ARANG
  • BILANGAN BULAT

Namun, Hibernate memungkinkan Anda memperluas daftar ini sedikit. Ini mendukung tipe Java ini: String, char, int, byte, short, boolean.

Jika kita menggunakan tipe INTEGER, lalu bagaimana cara menyandikan nama kelas Entity di dalamnya? Untuk ini, anotasi lain digunakan - @DiscriminatorValue .

Lihatlah sebuah contoh:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

Pada contoh di atas, kami memberi tahu Hibernate bahwa diskriminator akan menggunakan kolom user_type, yang akan menyimpan angka. Jika menyimpan nilai 1, berarti tipe barisnya adalah Employee, jika disimpan 2, maka tipe barisnya adalah Client. Sederhana dan indah.

@Nilai Diskriminator

Tapi itu belum semuanya. Anda dapat memberi tahu Hibernate cara menginterpretasikan jenis string ketika diskriminatornya adalah NULL.

Ini sebenarnya sangat sederhana. Anda menentukan nilai null untuk anotasi @DiscriminatorValue . Misalnya, seperti ini:

@DiscriminatorValue("null")

Contoh kelas:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

Kami telah memberi tahu Hibernate bahwa setiap baris tabel yang memiliki NULL di kolom user_type harus ditafsirkan sebagai objek bertipe User.

Tapi itu belum semuanya. Ada nilai lain yang menarik untuk anotasi @DiscriminatorValue.

Ini dia:

@DiscriminatorValue("not null")

Contoh kelas:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("not null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

Dengan anotasi ini, kami memberi tahu Hibernate bahwa setiap baris tabel dengan nilai non-NULL di kolom user_type harus ditafsirkan sebagai objek bertipe User. Tapi ini hanya untuk kasus jika kelas tidak ditemukan yang memiliki nomor yang diperlukan secara eksplisit.

Ini adalah cara kerjanya untuk nilai diskriminator yang berbeda:

  • 0 - buat objek bertipe Pengguna
  • 1 - buat objek bertipe Karyawan
  • 2 - buat objek bertipe Klien
  • 3 - buat objek bertipe Pengguna
  • 4 - buat objek bertipe Pengguna

@DiskriminatorFormula

Tapi itu belum semuanya. Untuk diskriminator kami, kami dapat menentukan rumus bilangan bulat yang akan digunakan untuk menghitung nilai untuk anotasi @DiscriminatorValue .

Ada anotasi khusus untuk ini, namanya @DiscriminatorFormula .

Contoh:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorFormula("case when ‘join’ is not null then 1 else 2 end")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

Nilai yang dikembalikan oleh @DiscriminatorFormula akan dibandingkan oleh Hibernate dengan nilai yang ditentukan dalam anotasi @DiscriminatorValue . Dengannya, Anda dapat menulis skenario yang cukup rumit:

@DiscriminatorFormula(
           	"case when address is not null " +
           	"then 'Client' " +
           	"else (" +
           	"   case when occupation is not null " +
           	"   then 'Employee' " +
           	"   else 'Unknown' " +
           	"   end) " +
           	"end "
)