2013-05-27 11 views
28

Cosa e quando è lo scenario migliore per utilizzare l'annotazione DiscriminatorValue in modalità di sospensione?Quando utilizzare l'annotazione DiscriminatorValue in modalità di sospensione

+1

Avete provato a passare attraverso la documentazione, ca n consulta http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168 e http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html /inheritance.html#inheritance-tablepersubclass-discriminator –

risposta

38

Questi 2 collegamenti aiutarmi a capire il concetto di ereditarietà più:

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

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

Per comprendere discriminatore, prima è necessario comprendere le strategie di successione: SINGLE_TABLE, CAUSE, TABLE_PER_CLASS.

Il discriminatore viene comunemente utilizzato nell'ereditarietà SINGLE_TABLE perché è necessaria una colonna per identificare il tipo di record.

Esempio: si dispone di una classe Studente e 2 sottoclassi: GoodStudent e BadStudent. Sia i dati Good che BadStudent verranno archiviati in 1 tabella, ma ovviamente è necessario conoscere il tipo e questo è quando DiscriminatorColumn entrerà. Vedere i collegamenti che ho postato sopra.

4

Quando si ha un'ereditarietà di entità utilizzando la strategia a tabella singola e si desidera che il valore della colonna discriminatore sia qualcosa di diverso dal nome della classe della classe concreta dell'entità o quando il tipo della colonna discriminatore sia non STRING.

Questo è spiegato, con un esempio, in the javadoc.

0

Ecco la spiegazione e un esempio su tavola di ibernazione per gerarchia di classi, si consideri che abbiamo classe base denominata pagamento e 2 classi derivate come Carta di Credito, Check

Se salviamo l'oggetto classe derivata come Carta di Credito o Controllare quindi automaticamente Anche l'oggetto della classe di pagamento verrà salvato nel database e nel database tutti i dati verranno archiviati in una sola tabella, che è sicuramente la tabella delle classi di base.

Ma qui dobbiamo utilizzare una colonna di discriminazione aggiuntiva nel database, solo per identificare quale oggetto di classe derivata è stato salvato nella tabella insieme all'oggetto classe di base, se non stiamo usando questa colonna di sospensione verrà lanciata l'eccezione

0

Lascia che ti spieghi un esempio. Supponiamo che tu abbia una classe chiamata Animali e sotto la classe Animali ci siano molte sottoclassi come Rettile, Uccello ... ecc.

E nel database avete tabella chiamata ANIMAL

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

Qui la colonna TYPE si chiama DiscriminatorColumn, perché questa colonna contiene i dati che separa chiaramente rettili e uccelli. E i dati REPTILE e BIRD nella colonna TYPE sono il DiscriminatorValue.

Così nella parte java tale struttura sarà simile:

Animal classe:

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

} 

classe Rettile: classe

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

} 

Uccello:

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

} 
Problemi correlati