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 "
)
GO TO FULL VERSION