2013-05-27 16 views
28

Co i kiedy najlepiej używać adnotacji DiscriminatorValue w stanie hibernacji?Kiedy używać adnotacji DiscriminatorValue w hibernacji

+1

Mają cię próbował przejrzeć dokumentację, ca n referuj http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168 i http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html /inheritance.html#inheritance-tablepersubclass-discriminator –

Odpowiedz

38

Te 2 linki mi pomóc najbardziej zrozumieć pojęcie dziedziczenia:

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

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

Aby zrozumieć dyskryminator, najpierw trzeba zrozumieć strategie dziedziczenia: SINGLE_TABLE dołączył, TABLE_PER_CLASS.

Dyskryminator jest powszechnie stosowany w dziedziczeniu SINGLE_TABLE, ponieważ do identyfikacji typu rekordu niezbędna jest kolumna.

Przykład: Masz klasę Student i dwie podklasy: GoodStudent i BadStudent. Zarówno dane Good, jak i BadStudent będą przechowywane w 1 tabeli, ale oczywiście musimy znać typ i właśnie wtedy pojawi się DiscriminatorColumn. Zobacz linki zamieszczone powyżej.

4

Po dziedziczeniu encji za pomocą strategii pojedynczej tabeli i chcesz, aby wartość kolumny dyskryminatora była inna niż nazwa klasy konkretnej klasy jednostki lub gdy typ kolumny dyskryminatora jest nie STRING.

Zostało to wyjaśnione, na przykład, w the javadoc.

0

Oto wyjaśnienie i jeden przykład na stole hibernacji za klasowej hierarchii, należy rozważyć mamy klasy bazowej o nazwie Płatności i 2 klasy pochodne, takie jak karta kredytowa, Sprawdź

Gdybyśmy zapisać pochodzący klasy obiekt jak karta kredytowa lub Sprawdź następnie automatycznie Obiekt klasy płatności zostanie również zapisany w bazie danych, a w bazie danych wszystkie dane będą przechowywane tylko w jednej tabeli, co z pewnością jest tabelą bazową.

Ale tutaj musimy użyć jednej dodatkowej kolumny dyskryminacyjnej w bazie danych, aby zidentyfikować, który obiekt klasy pochodnej został zapisany w tabeli wraz z obiektem klasy bazowej, jeśli nie używamy tej kolumny, hibernacja rzuci wyjątek

0

Pozwól, że wyjaśnię ci przykład. Załóżmy, że masz klasę o nazwie Animal i pod klasą Animal istnieje wiele podklas takich jak Reptile, Bird ... itd.

A w bazie masz tabela nazywa ANIMAL

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

Tutaj kolumna TYPE nazywa DiscriminatorColumn, bo ta kolumna zawiera dane, które wyraźnie oddziela gadów i ptaków. A dane REPTILE i w kolumnie są wartością DiscriminatorValue.

Tak więc w ramach java ta struktura będzie wyglądać następująco:

Animal klasa:

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

} 

klasa Reptile: Klasa

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

} 

Ptak:

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

} 
Powiązane problemy