2013-05-27 5 views
28

Was und wann ist das beste Szenario, um die DiscriminatorValue-Annotation in Hibernate zu verwenden?Wann verwenden Sie die DiscriminatorValue-Annotation im Ruhezustand?

+1

Sie haben versuchte, die Dokumentation durchzugehen, ca n siehe http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168 & http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html /inheritance.html#inheritance-tablepersubclass-discriminator –

Antwort

38

Diese 2 Links mir helfen, das Vererbungskonzept zu verstehen die meisten:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

Scheider Um zu verstehen, müssen Sie zuerst die Vererbungsstrategien verstehen: SINGLE_TABLE, JOINED, TABLE_PER_CLASS.

Diskriminator wird häufig in SINGLE_TABLE-Vererbung verwendet, weil Sie eine Spalte benötigen, um den Typ des Datensatzes zu identifizieren.

Beispiel: Sie haben eine Klasse Student und 2 Unterklassen: GoodStudent und BadStudent. Sowohl die Good- als auch die BadStudent-Daten werden in einer Tabelle gespeichert, aber natürlich müssen wir den Typ kennen und das ist der Zeitpunkt, an dem DiscriminatorColumn ankommt. Siehe die oben angegebenen Links.

4

Wenn Sie eine Entitätsvererbung unter Verwendung der Eintabellenstrategie haben und der Wert der Diskriminatorspalte etwas anderes als der Name der Klasse der konkreten Klasse des Elements sein soll oder wenn der Typ der Diskriminatorspalte ist nicht STRING.

Dies wird mit einem Beispiel in the javadoc erklärt.

0

ist die Erklärung und ein Beispiel auf Hibernate Tabelle pro Klassenhierarchie, betrachten wir Basisklasse namens Payment und 2 abgeleitete Klassen wie Creditcard haben, prüfen

Wenn wir die abgeleitete Klasse Objekt wie Creditcard oder Scheck speichern dann automatisch Das Objekt der Zahlungsklasse wird ebenfalls in der Datenbank gespeichert, und in der Datenbank werden alle Daten nur in einer einzelnen Tabelle gespeichert, was sicher eine Basisklassentabelle ist.

Hier müssen wir eine zusätzliche Diskriminatorspalte in der Datenbank verwenden, nur um zu identifizieren, welches abgeleitete Klassenobjekt in der Tabelle zusammen mit dem Basisklassenobjekt gespeichert wurde. Wenn wir diese Spalte nicht verwenden, wird die Ausnahme

ausgelöst
0

Lassen Sie mich Ihnen ein Beispiel erklären. Angenommen, Sie haben eine Klasse namens Animal und unter Animal class gibt es viele Unterklassen wie Reptile, Bird ... etc.

Und in der Datenbank, die Sie Tabelle namens

--------------------------- 
ID||NAME  ||TYPE  || 
--------------------------- 
1 ||Crocodile ||REPTILE || 
--------------------------- 
2 ||Dinosaur ||REPTILE || 
--------------------------- 
3 ||Lizard ||REPTILE || 
--------------------------- 
4 ||Owl  ||BIRD  || 
--------------------------- 
5 ||parrot ||BIRD  || 
--------------------------- 

Hier wird die Spalte TYPE genannt wird DiscriminatorColumn ANIMAL haben, da diese Spalt Daten enthalten, die Reptilien und Vögel klar trennt. Und die Daten REPTILE und BIRD in Spalte TYPE sind der DiscriminatorValue.

So in der Java-Teil würde diese Struktur wie folgt aussehen:

Tierklasse:

@Getter 
@Setter 
@Table(name = "ANIMAL") 
@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE") 
public class Animal { 

    @Id 
    @Column(name = "ID") 
    private String id; 

    @Column(name = "NAME") 
    private String name; 

} 

Reptil Klasse:

@Entity 
@DiscriminatorValue("REPTILE") 
public class Reptile extends Animal { 

} 

Vogelklasse:

@Entity 
@DiscriminatorValue("BIRD") 
public class Bird extends Animal { 

} 
Verwandte Themen