Leírás

Az előző leckében láthatta, hogy a Hibernate egy speciális DTYPE VARCHAR oszlopot használ egy entitásosztály nevének tárolására. Az ilyen oszlopot diszkriminátornak nevezzük . Arra szolgál, hogy egyértelműen meghatározza, hogy melyik osztályt kell létrehozni egy adott sorhoz az adatbázisban.

Ezt az oszlopot a @DiscriminatorColumn megjegyzéssel módosíthatja . Példa:

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

A JPA specifikációja szerint a diszkriminátornak a következő típusai lehetnek:

  • HÚR
  • CHAR
  • EGÉSZ SZÁM

A Hibernate azonban lehetővé teszi a lista egy kicsit bővítését. Támogatja a következő Java típusokat: String, char, int, byte, short, boolean.

Ha INTEGER típust használunk, akkor hogyan lehet bele kódolni az Entity osztály nevét? Ehhez egy másik megjegyzést használnak - @DiscrinatorValue .

Nézz egy példát:

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

A fenti példában azt mondtuk a Hibernate-nak, hogy a diszkriminátor a user_type oszlopot fogja használni, amely számokat tárol. Ha az 1 értéket tárolja, akkor az azt jelenti, hogy a sor típusa Alkalmazott, ha 2, akkor a sor típusa Ügyfél. Egyszerű és szép.

@DiscrinatorValue

De ez még nem minden. Megadhatja a Hibernate-nak, hogyan értelmezze a karakterlánc típusát, ha annak megkülönböztetője NULL.

Valójában nagyon egyszerű. Megadhatja a @DiscriminatorValue megjegyzés null értékét . Például így:

@DiscriminatorValue("null")

Példa az osztályra:

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

Azt mondtuk a Hibernate-nak, hogy minden olyan táblázatsort, amelynek a user_type oszlopában NULL szerepel, User típusú objektumként kell értelmezni.

De ez még nem minden. Van egy másik érdekes érték a @DiscriminatorValue annotációhoz.

Itt van ez:

@DiscriminatorValue("not null")

Példa az osztályra:

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

Ezzel a megjegyzéssel azt mondtuk a Hibernate-nak, hogy minden olyan táblázatsort, amely nem NULL értéket tartalmaz a user_type oszlopban, User típusú objektumként kell értelmezni. De ez csak arra az esetre vonatkozik, ha nem található olyan osztály, amelynél kifejezetten meg van adva a szükséges szám.

Ez így fog működni a diszkriminátorok különböző értékei esetén:

  • 0 - Felhasználó típusú objektum létrehozása
  • 1 - hozzon létre egy Employee típusú objektumot
  • 2 - hozzon létre egy Client típusú objektumot
  • 3 - hozzon létre egy User típusú objektumot
  • 4 - hozzon létre egy User típusú objektumot

@DiscriminatorFormula

De ez még nem minden. Megkülönböztetőnk számára megadhatunk egy egész képletet, amellyel kiszámítja a @DiscriminatorValue annotáció értékeit .

Erre van egy külön megjegyzés, ez a @DiscriminatorFormula .

Példa:

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

A @DiscriminatorFormula által visszaadott értékeket a Hibernate összehasonlítja a @DiscriminatorValue megjegyzésekben megadott értékekkel . Ezzel meglehetősen összetett forgatókönyveket írhat:

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