Cuándo usar la anotación DiscriminatorValue en hibernación


¿Cuál y cuándo es el mejor escenario para usar la anotación DiscriminatorValue en hibernación?

Author: Jobin Joseph, 2013-05-27

4 answers

Estos 2 enlaces me ayudan a entender el concepto de herencia más:

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

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

Para entender discriminator, primero debe entender las estrategias de herencia: SINGLE_TABLE, JOINED, TABLE_PER_CLASS.

El discriminador se usa comúnmente en la herencia SINGLE_TABLE porque necesita una columna para identificar el tipo de registro.

Ejemplo: Tienes un Estudiante de clase y 2 subclases: Buen Estudiante y mal estudiante. Tanto los datos buenos como los BadStudent se almacenarán en 1 tabla, pero por supuesto necesitamos saber el tipo y ahí es cuando DiscriminatorColumn entrará. Vea los enlaces que publiqué arriba.

 43
Author: czetsuya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 02:26:37

Déjame explicarte con un ejemplo . Supongamos que usted tiene una clase llamada Animal y bajo Clase Animal hay muchas subclases como Reptil, Pájaro ...sucesivamente.

Y en la base de datos tienes una tabla llamada ANIMAL

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

Aquí la columna TYPE se llama DiscriminatorColumn , porque esta columna contiene datos que separan claramente Reptiles y Aves. Y los datos REPTILE y BIRD en la columna TYPE son el DiscriminatorValue.

Así que en la parte java esta estructura sería aspecto :

Clase animal:

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

}

Clase de reptiles:

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

}

Clase de aves:

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

}
 12
Author: Joby Wilson Mathews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-24 06:16:13

Cuando tiene una herencia de entidad usando la estrategia de tabla única, y desea que el valor de la columna discriminador sea algo distinto del nombre de la clase de la clase concreta de la entidad, o cuando el tipo de la columna discriminador no es una cadena.

Esto se explica, con un ejemplo, en el javadoc.

 7
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-27 11:42:38

Aquí está la explicación y un ejemplo en la tabla de hibernación por jerarquía de clases, considere que tenemos clase base llamada Pago y 2 clases derivadas como CreditCard, Cheque

Si guardamos el objeto de clase derivado como CreditCard o Cheque, entonces automáticamente el objeto de clase de pago también se guardará en la base de datos, y en la base de datos todos los datos se almacenarán en una sola tabla, que es la tabla de clase base sin duda.

Pero aquí debemos usar una columna discriminadora adicional en la base de datos, solo para identificar qué objeto de clase derivado se ha guardado en la tabla junto con el objeto de clase base, si no estamos utilizando esta columna hibernate lanzará la excepción

 0
Author: NAJAM HASHMI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 09:12:18