it-swarm.com.de

Verwendung der DiscriminatorValue-Annotation im Ruhezustand

Was und wann ist das beste Szenario für die Verwendung der DiscriminatorValue-Annotation im Ruhezustand?

34
czetsuya

Diese beiden Links helfen mir, das Vererbungskonzept am besten zu verstehen:

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

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

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

Diskriminator wird häufig in der 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. Natürlich müssen wir den Typ kennen, und dann wird DiscriminatorColumn angezeigt. Siehe die oben angegebenen Links.

43
czetsuya

Lassen Sie sich an einem Beispiel erklären. Angenommen, Sie haben eine Klasse mit dem Namen Animal und in der Kategorie Animal gibt es viele Unterklassen wie Reptile, Bird usw.

Und in der Datenbank haben Sie eine Tabelle namens ANIMAL

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

Die Spalte TYPE heißt hier DiscriminatorColumn, da diese Spalte Daten enthält, die Reptiles und Birds klar voneinander trennen. Die Daten REPTILE und BIRD in der Spalte TYPE sind der DiscriminatorValue.

Im Java-Teil würde diese Struktur also 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;

}

Reptilklasse:

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

}

Vogelklasse:

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

}
21

Wenn Sie über eine Entitätenvererbung verfügen, die die Einzeltabellenstrategie verwendet, und Sie möchten, dass der Wert der Diskriminatorspalte einen anderen Namen als den Namen der Klasse der entitätsspezifischen Klasse hat oder der Typ der Diskriminatorspalte nicht STRING ist.

Dies wird an einem Beispiel in dem Javadoc erklärt.

7
JB Nizet

Hier ist die Erklärung und ein Beispiel für die Hibernate-Tabelle pro Klassenhierarchie. Wir haben eine Basisklasse namens Payment und 2 abgeleitete Klassen wie CreditCard, Check

Wenn wir das abgeleitete Klassenobjekt wie CreditCard oder Scheck speichern, werden automatisch auch das Zahlungsklassenobjekt in der Datenbank gespeichert. In der Datenbank werden alle Daten nur in einer einzigen Tabelle gespeichert, was sicher eine Basisklassentabelle ist.

Hier müssen wir jedoch eine zusätzliche Unterscheidungsspalte in der Datenbank verwenden, um nur zu ermitteln, welches abgeleitete Klassenobjekt zusammen mit dem Basisklassenobjekt in der Tabelle gespeichert wurde. Wenn diese Spalte nicht verwendet wird, löst der Ruhezustand die Ausnahme aus

0
NAJAM HASHMI