web-dev-qa-db-fra.com

Quand utiliser l'annotation DiscriminatorValue en veille prolongée?

Quel et quel est le meilleur scénario pour utiliser l'annotation DiscriminatorValue en veille prolongée?

34
czetsuya

Ces 2 liens m'aident le plus à comprendre le concept d'héritage:

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

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

Pour comprendre le discriminateur, vous devez d’abord comprendre les stratégies d’héritage: SINGLE_TABLE, JOINED, TABLE_PER_CLASS.

Discriminator est couramment utilisé dans l'héritage SINGLE_TABLE car vous avez besoin d'une colonne pour identifier le type de l'enregistrement.

Exemple: vous avez une classe Student et 2 sous-classes: GoodStudent et BadStudent. Les données Good et BadStudent seront stockées dans une table, mais nous devons bien sûr connaître le type et c'est à ce moment-là que DiscriminatorColumn entrera. Voir les liens que j'ai postés ci-dessus.

43
czetsuya

Laissez-moi vous expliquer avec un exemple. Supposons que vous ayez une classe appelée Animal et que dans la classe Animal, il existe de nombreuses sous-classes comme Reptile, Bird, etc.

Et dans la base de données, vous avez une table appelée ANIMAL

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

Ici, la colonne TYPE s'appelle DiscriminatorColumn, car cette colonne contient des données qui séparent clairement les reptiles et les oiseaux. Et les données REPTILE et BIRD dans la colonne TYPE sont la valeur discriminante.

Donc, dans la partie Java, cette structure ressemblerait à ceci:

Classe animale:

@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 de reptile:

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

}

Classe d'oiseau:

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

}
21
Joby Wilson Mathews

Lorsque vous avez un héritage d'entité utilisant la stratégie de table unique et que vous voulez que la valeur de la colonne discriminante soit autre que le nom de la classe de la classe concrète de l'entité, ou que le type de la colonne discriminante ne soit pas STRING.

Ceci est expliqué, avec un exemple, dans le javadoc .

7
JB Nizet

Voici l'explication et un exemple sur la table d'hibernation par hiérarchie de classe, considérons que nous avons la classe de base nommée Payment et 2 classes dérivées comme CreditCard, Check

Si nous sauvegardons l'objet de classe dérivée comme CreditCard ou Check, alors automatiquement, l'objet de classe Payment sera également enregistré dans la base de données. Dans la base de données, toutes les données seront stockées dans une seule table, qui est une table de classe de base.

Mais ici, nous devons utiliser une colonne discriminante supplémentaire dans la base de données, juste pour identifier quel objet de classe dérivée a été sauvegardé dans la table avec l'objet de classe de base. Si nous n'utilisons pas cette colonne, hibernate lève l'exception.

0
NAJAM HASHMI