2016-07-31 25 views
1

ich ein Szenario etwas wie diesesEinstellung Diskriminatorwert dynamisch (Hibernate Mappings)

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "TANDC_TYPE", discriminatorType = DiscriminatorType.STRING, length = 32) 
@Table(name = "T_TERMS_AND_CONDITIONS", schema = DataSourceConfig.PERSISTENCE_SCHEMA_NAME) 
public class TermsAndConditions { 
... 
} 

Und es ist Kind-Klasse die Diskriminatorwert „CREATOR“

@Entity 
@DiscriminatorValue("CREATOR") 
public class AccountTermsAndConditions extends TermsAndConditions { 
... 
} 

Ein anderes Kind Klasse den Unterscheidungswert aufweist "ORDER"

@Entity 
@DiscriminatorValue("ORDER") 
public class OrderTermsAndConditions extends TermsAndConditions { 
... 
} 

Hier ist meine Anforderung, die Bedingungen zu erleichtern Ons Mapping für eine neue Art von Konto namens "USER", die zu meinem AccountTermsAndConditions verwandt ist.

Nun, ich möchte keine weitere Klasse für den Konto-Typ "USER" (so etwas wie UserTermsAndConditon) hinzufügen, da beide "CREATOR" und "USER" auf Arten von Konten beziehen.

Ich brauche hier eine mögliche Lösung, um meinen Diskriminatorwert je nach Kontotyp entweder auf "CREATOR" oder "USER" zu setzen.

Gibt es eine Möglichkeit, meinen Diskriminatorwert basierend auf den Bedingungen innerhalb der Klasse festzulegen?

ich auch in der Dokumentation des Orakels gesehen habe, die besagt:

„Wenn die DiscriminatorValue Annotation nicht angegeben ist und eine Diskriminator Spalte verwendet wird, eine providerspezifische Funktion verwendet wird um einen Wert zu erzeugen, die der Entitätstyp. "

Wie gehe ich mit der Implementierung vor?

Bitte helfen Sie mir.

Antwort

1

Es scheint, dass Sie die @DiscriminatorFormula nutzen möchten, da Sie die Vererbung einzelner Tabellen verwenden. Damit können wir die beiden Typen CREATOR und USER auf CREATOR abbilden, so dass derselbe Java-Klassentyp wiederverwendet wird.

@DiscriminatorFormula(
    "case when TANDC_TYPE = 'ORDER' then 'ORDER' " + 
    "else (" + 
    " case when TANDC_TYPE in ('CREATOR','USER') then 'CREATOR' " + 
    " else 'Unknown' " + 
    " end) " + 
    "end " 
) 

würde ich wahrscheinlich AccountTermsAndConditions Scheider ACCOUNT Wechsel vorschlagen und dann CREATOR und USER-ACCOUNT in der obigen SQL-Fragment für Konsistenz abzubilden. Sie können mehr über @DiscriminatorFormulahere lesen.

+0

Hier möchte ich entweder "CREATOR" oder "USER" basierend auf der Überprüfung des Benutzertyps verwenden. Ich möchte den TANDC_TYPE nicht als 'CREATOR' für 'CREATOR' und 'USER' haben. Ist das möglich ? Etwas wie if (userType.equals ("CREATOR")) {db.setTandCType ("ERSTELLER");} else {db.setTandCType ("BENUTZER");} – user3152686

+0

Wenn Sie möchten, dass Ihr Code das beeinflusst, sehe ich keinen Grund dafür Sie können dann 'AccountTermsAndConditions' nicht mit einem neuen Diskriminatorwert für' USER' ohne zusätzliche Felder erweitern. – Naros

+0

Danke. Arbeiten !! – user3152686