Tanım

Önceki derste Hibernate'in bir Entity sınıfının adını depolamak için özel bir DTYPE VARCHAR sütunu kullandığını gördünüz. Böyle bir sütuna ayrımcı denir . Veritabanında belirli bir satır için hangi sınıfın oluşturulacağını kesin olarak belirlemek için kullanılır.

Bu sütunu @DiscriminatorColumn ek açıklamasıyla değiştirebilirsiniz . Örnek:

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

JPA spesifikasyonuna göre, bir ayrımcı aşağıdaki tiplere sahip olabilir:

  • SİCİM
  • ÇAR
  • TAM SAYI

Ancak Hazırda Bekletme, bu listeyi biraz genişletmenize olanak tanır. Şu Java türlerini destekler: String, char, int, byte, short, boolean.

INTEGER tipini kullanırsak, içindeki Entity sınıfının adını nasıl kodlayacağız? Bunun için başka bir ek açıklama kullanılır - @DiscriminatorValue .

Bir örneğe bakın:

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

Yukarıdaki örnekte, Hibernate'e ayrımcının sayıları depolayacak olan user_type sütununu kullanacağını söyledik. 1 değerini saklıyorsa, satır tipinin Çalışan olduğu, 2'nin saklandığı takdirde satır tipinin İstemci olduğu anlamına gelir. Basit ve güzel.

@DiscriminatorValue

Ama hepsi bu değil. Ayırıcısı NULL olduğunda Hibernate'e bir dize türünün nasıl yorumlanacağını söyleyebilirsiniz.

Aslında çok basit. @DiscriminatorValue ek açıklaması için boş değeri belirtirsiniz . Örneğin, bunun gibi:

@DiscriminatorValue("null")

Sınıf örneği:

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

Hibernate'e user_type sütununda NULL olan herhangi bir tablo satırının User türünde bir nesne olarak yorumlanması gerektiğini söyledik.

Ama hepsi bu değil. @DiscriminatorValue ek açıklaması için ilginç bir değer daha var.

İşte bu:

@DiscriminatorValue("not null")

Sınıf örneği:

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

Bu ek açıklama ile Hibernate'e user_type sütununda NULL olmayan bir değere sahip herhangi bir tablo satırının User türünde bir nesne olarak yorumlanması gerektiğini söyledik. Ancak bu, yalnızca gerekli sayının açıkça belirtildiği bir sınıfın bulunamaması durumunda geçerlidir.

Ayrımcıların farklı değerleri için şu şekilde çalışacaktır:

  • 0 - Kullanıcı türünde bir nesne oluşturun
  • 1 - Çalışan türünde bir nesne oluşturun
  • 2 - İstemci türünde bir nesne oluşturun
  • 3 - Kullanıcı türünde bir nesne oluşturun
  • 4 - Kullanıcı türünde bir nesne oluşturun

@DiscriminatorFormula

Ama hepsi bu kadar değil. Ayırıcımız için, @DiscriminatorValue ek açıklaması için değerleri hesaplayacağı bir tamsayı formülü belirtebiliriz .

Bunun için özel bir açıklama var, adı @DiscriminatorFormula .

Örnek:

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

@DiscriminatorFormula tarafından döndürülen değerler, Hibernate tarafından @DiscriminatorValue ek açıklamalarında belirtilen değerlerle karşılaştırılacaktır . Bununla oldukça karmaşık senaryolar yazabilirsiniz:

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