Esta vez hablemos sobre el diseño jerárquico de Hibernate, que es el diseño de la relación de herencia entre las entidades.
Tal vez esto sea más abstracto, veamos los ejemplos directamente.
1) Primero veamos la práctica común e ingresemos directamente el código: las tres clases reales son las siguientes:
El titem de clase pública implementa serializable {// omitir get/set método private int id; fabricación de cuerdas privadas; nombre de cadena privada; } public class tbook extiende titem {// omitir el método get/set private int pageCount; } public class TDVD extiende titem {// omitir get/establecer método privado cadena región de región; }
Aquí necesitamos tres archivos de mapeo, los contenidos son los siguientes:
<class name = "titem" table = "item"> <id name = "id" columna = "id" type = "java.lang.integer"> <generador/> </id> <propiedad name = "name" column = "name" type = "java.lang.string"/> <name de propiedad = "fabricar" columna = "fabricar" type = "java.lang.string"/> <scalsbook "ClassBook <ClassAncader <ClassBOd =" ClassBOd = "ClassBOd =" ClassBOd "<ClassBOd" <ClassBOd "<ClassBOd" <ClassAncade <ClassAncel. table = "Libro"> <id name = "id" columna = "id" type = "java.lang.integer"> <generator/> </id> <propiedad name = "name" column = "name" type = "java.lang.string"/> <Property = "fabricar" columna = "fabricación" type = "java.lang.string"/> <property name = "pagaD" columna "columna" fabricar "type" type = "java.lang.string"/> <property name = "pagaD" column "columna" columna "columna" pAGED "PAGED" type="java.lang.Integer"/> </class> <class name="TDVD" table="DVD"> <id name="id" column="id" type="java.lang.Integer"> <generator /> </id> <property name="name" column="name" type="java.lang.String"/> <property name="manufacture" column="manufacture" type = "java.lang.string"/> <propiedad name = "regioncode" column = "regioncode" type = "java.lang.string"/> </class>
Archivos de mapeo muy ordinarios, sin diferencia de los anteriores.
Escribamos un método de prueba directamente:
public void testSelect () {Query Query = session.CreateQuery ("de titem"); List list = query.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {System.out.println ("name:"+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((), lo Tenga en cuenta que aquí estamos usando la clase Titem, no la clase de palabras específica. Aquí buscará automáticamente subclases heredadas de la clase Titem y encontrará todos los resultados. Esto implica un polimorfismo. La etiqueta de clase tiene el polimorfismo de propiedad, y su valor predeterminado está implícito, lo que significa que el resultado se puede consultar sin especificar un nombre. Si es explícito, significa que debe especificar un nombre de clase específico antes de poder encontrar el resultado de este tipo.
2) En el ejemplo anterior, utilizamos tres archivos de mapeo. Cuando necesitamos modificarnos, necesitamos modificar tres archivos de mapeo, que no es factible para grandes proyectos. Además, cada tabla tiene los campos correspondientes para la clase principal correspondiente, que es redundante. Entonces tenemos el siguiente método.
La clase de entidad sigue siendo la misma que en 1). Cambiamos el archivo de asignación de tres a uno, y solo conservamos el archivo de asignación del titem. Pero necesitamos hacer modificaciones correspondientes, y el contenido ahora es el siguiente:
<class name = "titem" table = "item" polyMorphism = "explicit"> <id name = "id" columna = "id" type = "java.lang.integer"> <generador/> </id> <propiedad name = "name" column = "name" type = "java.lang.string"/> <name de propiedad = "fabricación =" fabricación "type" type "type" tyte = "" jsting.lang.string.string "/> <name de propiedad =" fabricación = "fabrica" typle "type" type "type" Java.lang.lang "/" <Juneed-Subclass name = "tbook" table = "tbook"> <key columna = "id" /> <propiedad name = "pageCount" column = "pageCount" type = "java.lang.integer" /> < /unión-subclass> <Joined-subclass name = "tdvd" table = "tdvd"> <key column = "id" /"id" <Id "<Id" <Id "<Id" <iD "iD" name "name" name "" TDVD "TABLE =" TDVD "> <Key columna =" Id " /" Id " /" iD " /" Nombre de la propiedad ". columna = "regionCode" type = "java.lang.string"/> </unión-subclass> </class>
Aquí, solo tenemos un archivo de mapeo, pero hay una etiqueta de clase subclase unida, lo que indica que esta clase hereda de la clase actual, <Key> indica la clave principal de la subtabilitación. Aquí, la subtabilitación se refiere a las dos tablas correspondientes a las subclases, Tbook y TDVD. Solo los campos en la subtabia se especifican en la propiedad.
De esta manera, la tabla generada después de ejecutar es la siguiente:
La tabla correspondiente a las dos subclases son solo los campos que especificamos a través de la propiedad. Esto evita múltiples campos en la tabla, de modo que la tabla de palabras solo mantiene sus campos separados. Cuando cambia la clase de elementos, no hay necesidad de hacer demasiadas modificaciones.
3) Aprendamos sobre otro método para implementar el diseño jerárquico, que se logra colocando banderas en la mesa. En el archivo de asignación Hibernate, lo implementamos a través de la etiqueta Descriminator.
Sin más preámbulos, echemos un vistazo al ejemplo:
Modificamos el archivo de asignación del título de ayer a:
<class name = "titem" table = "item" polyMorphism = "explicit"> <id name = "id" columna = "id" type = "java.lang.integer"> <generador/> </id> <Discriminator columna = "categoría" type = "java.lang.string"/> <name de propiedad = "nombre" columna = "name" type = "java.lang.lang.string//> <Putorial name = "fabricación" columna = "fabricar" type = "java.lang.string"/> </class>
Al ver el medio, agregamos una etiqueta discriminadora, que muestra qué campo se distinguen nuestras dos subclases.
<subclass name = "tbook" discriminator-value = "1"> <propiedad name = "pageCount" column = "pageCount"/> </subclass> <subclass name = "tdvd" discriminator-value = "2"> <name = "regionCode" column = "regioncode"/> </subclass>
Vemos estos dos párrafos, lo que indica que cuando el valor del campo especificado por el discriminador es 1, indica que es una clase Tbook y PageCount tiene un valor; Cuando el valor del campo especificado por el discriminador es 2, indica que es una clase TDVD y RegionCode tiene un valor.
De esta manera, solo necesitamos usar una tabla, lo que indica la relación entre ellos y varias clases. Tenga en cuenta que este método no es bueno para demasiadas subclases. Causará demasiados campos en la tabla principal y causará ciertos inconvenientes de diseño.