Hibernate ha realizado clasificación e integración y descubrió que Hibernate en realidad se divide en tres partes: objeto central, mapeo y HQL. Estas tres partes se usan más comúnmente en el proceso de desarrollo. Los artículos anteriores discuten los métodos de conversión entre objetos y objetos centrales. Luego, discuta los métodos de uso de mapeo de Hibernate.
Una función importante de Hibernate es el mapeo, que puede convertir entre el modelo de objeto y el modelo relacional. Se defiende por ideas de programación orientadas a objetos. Los desarrolladores que usan programas de mapeo solo necesitan preocuparse por la escritura de código en el modelo de objeto. El mapeo entre un objeto y una base de datos relacional generalmente se define mediante un documento XML. Este documento de mapeo está diseñado para ser legible y se puede modificar manualmente. Resumen esta relación de mapeo como se muestra en la siguiente figura:
El mapeo se define a través de XML, se gestiona utilizando la sesión creada por Hibernate, y finalmente la sesión usa JTA para enviar los cambios a la base de datos. La sesión puede entenderse como un gerente de persistencia, que administra objetos en la capa de persistencia. Es creado por SessionFactory. Al programar con Hibernate, primero debe conectarse a la base de datos, por lo que primero debe verificar la configuración de la conexión de la base de datos en el XML, crear una Factory de Session de acuerdo con la configuración del documento (que puede entenderse como un espejo de la base de datos) y luego crear una sesión de sesión. Finalmente, la sesión enviará los cambios a la base de datos de manera uniforme, lo que completará todas las operaciones.
Proceso de uso
1. Cree un archivo de asignación y el archivo de asignación se sufra con .hbm.xml, lo que indica que es un archivo de asignación de hibernado;
2. Registre la clase de entidad en el archivo de asignación y agregue las propiedades de la clase de entidad a la clase de asignación. Al agregar propiedades, debe especificar dos valores: ID y propiedad. La identificación indica que es el único identificador de una entidad, y la propiedad indica que es una columna de campo de la tabla;
3. Envíe modificaciones y sincronice datos.
Nota: Los desarrolladores que han desarrollado datos XML a la base de datos pronto comprenderán que esta asignación es en realidad un proceso de actualización por lotes y creación de lotes, y el mapeo no es una excepción. Hibernate estipula un conjunto de estándares de mapeo que se pueden convertir de acuerdo con los estándares. Su implementación interna todavía está muerta, por lo que solo es relativamente flexible y fácil de usar.
Un proceso de mapeo de clase de entidad simple:
1. Código de propiedad de la clase de entidad Usuario1:
paquete com.Hibernate; import java.util.date; User de clase pública1 {ID de cadena privada; nombre de cadena privada; contraseña de cadena privada; Fecha privada CreateTime; Fecha privada Explicación; public String getId () {return id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; } fecha pública getCreateTime () {return CreateTime; } public void setCreateTime (date CreateTime) {this.CreateTime = CreateTime; } fecha pública getExpireTime () {return ExtImetime; } public void setExpireTime (fecha de caducidad) {this.expireTime = expireTime; }}
2. La implementación del código interno del usuario1.hbm.xml del archivo de asignación user1.java:
La configuración que se puede configurar en la base de datos básica también se proporciona en Hibernate. Puede usar atributos de etiqueta para establecer relaciones de mapeo específicas.
Class-> Las tablas usan etiquetas de clase, propiedades de uso común:
(1) Nombre: clase de entidad mapa, su valor debe establecerse en el nombre de la clase de entidad que debe convertirse en una tabla. Durante la sincronización, la clase de entidad correspondiente se encontrará basada en este atributo.
(2) Tabla: asigne el nombre de la tabla de la base de datos. Si el nombre de la tabla a asignar es diferente del nombre de la clase de entidad, use esta propiedad para especificar la tabla asignada. Si no existe, se creará una tabla en función del valor de la propiedad.
Verifique la estructura de la tabla generada por la configuración en la figura anterior, como se muestra a continuación:
El nombre de la tabla se cambia a t_user1; El campo ID se cambia a user_id, y la longitud del campo es de 32 bits; La propiedad CreateTime se asigna al campo de la base de datos create_time, y se modifica hasta el tipo de fecha.
Propiedad -> Campos Use ID o etiquetas de propiedad, propiedades de uso común:
(1) Nombre: la función es similar al nombre de la etiqueta de clase, y el valor determina el nombre del atributo de mapeo de la clase Entity;
(2) columna: similar a la tabla de la etiqueta de clase de entidad, especificando el nombre de la columna de la tabla de mapeo, y se creará si no existe;
(3) Escriba: especifique el tipo de datos asignado a los campos en la base de datos y vea el documento según sea necesario;
(4) El generador, que es opcional, se usa para generar un identificador único para una clase persistente.
<id name = "id" type = "long" column = "cat_id"> <generator> <param name = "table"> uid_table </amam> <param name = "column"> next_hi_value_column </amam> </200 generador> </id>
Todos los generadores implementan la interfaz org.hibernate.id.identifierGenerator. Esta es una interfaz muy simple; Algunas aplicaciones pueden optar por proporcionar su propia implementación específica. Por supuesto, Hibernate proporciona muchas implementaciones incorporadas. Aquí hay algunos tipos de uso común:
(1) Identidad: el identificador devuelto es de tipo largo, corto o int. Similar al campo de autoincremento de la base de datos.
(2) Secuencia: use secuencias en DB2, PostgreSQL, Oracle, SAP DB, MCKOI y Generadores en Interbase. El identificador devuelto es de tipo largo, corto o int. En toda la base de datos, en lugar de aumentar la autosuficiencia en una sola tabla, debe especificar que se debe agregar el autosuficiente en una sola tabla.
(3) UUID: use un algoritmo UUID de 128 bits para generar un identificador de tipo de cadena, que es único en una red (usando una dirección IP). El UUID está codificado como una cadena de números hexadecimales de 32 bits. Similar al número de serie generado por .NET.
(4) Nativo: elija uno de identidad, secuencia o hilo en función de las capacidades de la base de datos subyacente. De manera flexible, el tipo de identidad utilizado se determinará en función de la base de datos utilizada. MySQL seleccionará Identity y Oracle seleccionará secuencia.
(5) Asignado: cree manualmente una ID de identificación para la clase de entidad. Esta es la política de generación predeterminada cuando no se especifica el elemento <Generator>.
(6) Extranjeros: use otro identificador de objeto asociado. Por lo general, se usa en combinación con <One to-One>.
Los desarrolladores a menudo se usan para el método de configuración manual para escribir propiedades de configuración de acuerdo con las instrucciones de documentación. Esto es muy primitivo. Los principiantes recomiendan usar el método de configuración manual para ayudar a pensar. También hay muchas herramientas de terceros que utilizan métodos visuales para configurar y generar documentos de configuración XML, lo que mejora la eficiencia del desarrollo. Herramientas similares como XdoClet, MiddleGen y Andormda.
Las asignaciones asociativas son muchas a uno
El mapeo básico de Hibernate se discute anteriormente. Una clase de entidad corresponde a una tabla y utiliza la asignación de etiquetas <class> en el archivo de asignación de hibernado correspondiente. Y las propiedades normales en la clase de entidad corresponden al campo Tabla y se asignan utilizando la etiqueta <Property>. Además, al construir clases de entidad, debe prestar atención a: El constructor predeterminado sin parámetros debe implementarse en clases de entidad, y se debe proporcionar una etiqueta. Se recomienda no usar final para modificar la clase de entidad y generar métodos getter y setter para la clase de entidad. Finalmente, se introducen varias estrategias principales de generación de claves principales, y el siguiente paso es discutir el mapeo de muchos a uno.
Este mapeo de correlación de muchos a uno se refleja en el modelo de objeto. Es una relación de agregación. El usuario es parte del grupo. Hay usuarios en el grupo. Sus ciclos de vida son diferentes y pueden reflejarse en la siguiente figura:
Entonces, ¿cómo se establece este mapeo de relaciones de muchos a uno en Hibernate? A continuación se introducirá dos métodos: use la etiqueta <Boste-to-One> para mapear directamente, o use la cascada <Many-to-One> para modificar la tabla.
1. Mapeo directo de muchos a uno <Br /> Se puede entender desde el significado literal que se refiere a una relación de muchos a uno. Muchos se refieren al final más, y uno se refiere al final menos. Cuando lo usa, la etiqueta se usa a menudo en el HBM del final más, y el atributo de nombre de <ingle-to-uno> se establece en el atributo de un extremo de uno en la clase correspondiente del archivo de mapeo, como: <Many-to-one name = "group" column = "groupid"> </muchos to-one>. Esta etiqueta se agrega a user.hbm.xml, que corresponde a muchos; El valor del nombre en la etiqueta es el grupo para mapear uno, y habrá un atributo llamado grupo en user.java. A continuación, echemos un vistazo a la clase de código específica que implementa la implementación.
(1) Código de clase user.java, que tiene una propiedad llamada grupo, que se utilizará como el valor de nombre del único extremo de <ingle-to-one>.
Usuario de clase pública {nombre de cadena privada; public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } Grupo de grupo privado; Public Group getGroup () {Return Group; } public void setGroup (grupo de grupo) {this.group = grupo; }}(2) El valor del nombre de <ingle-to-one> en user.hbm.xml es el valor de propiedad del lado de un lado en user.java. Generará una nueva columna en la base de datos, que puede entenderse como una clave externa de la tabla de usuario.
<? xml versión = "1.0"?> < -> <hibernate-mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id" /> <generador /> </id> <!-El valor del nombre es una propiedad en una correspondiente en user.Java. Generará automáticamente una columna en la tabla, por lo que la columna se renombrará usando la columna-> <Many-to-One name = "Group" columna = "GroupId"> </Many-to-One> </class> </hibernate-mapping>
(3) Pruebe la relación de mapeo anterior, escriba dos objetos de usuario en la tabla, nombrarlo User1 y User2, nombrarlo Zhang San y Li Si, use la sesión para guardar el objeto, escriba datos en la base de datos, el código es el siguiente:
public void testSave1 () {session session = null; intente {session = getSession.getSession (); session.BeginTransaction (); Grupo grupo = nuevo grupo (); Group.SetName ("Power Node"); Usuario user1 = new User (); user1.setName ("Zhang San"); user1.setGroup (grupo); Usuario user2 = new User (); user2.setName ("li si"); user2.setGroup (grupo); session.save (usuario1); session.save (user2); // se informará el error TransientObjectException // el error ocurre al limpiar el caché TransientObjectException // Debido a que el grupo es un estado transitorio, no se sesiona, y no hay datos coincidentes en la base de datos // cuando el usuario es el estado persistente, Hibernate no puede encontrar el objeto de grupo en el cache // revelados: los objetos en el estado persistente no pueden referirse a los objetos de los objetos en los objetos transitorios // Esto no puede encontrar el objeto del grupo // session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). Rollback (); } Finalmente {getSession.clossessession (sesión); }}Sin embargo, cuando se usa el código anterior, se informará una transmedObjectException al ejecutar escrituras. Esto se debe a que al guardar el objeto de usuario, buscará objetos de grupo en la memoria de acuerdo con el grupo agregado en <ingle-to-one>. Sin embargo, en el código anterior, el objeto de grupo siempre ha estado en el estado transitorio y no es administrado por la sesión, lo que significa que el objeto de sesión no se puede encontrar, y el objeto de usuario ingresa al estado persistente, por lo que se informará este error. El código correcto es el siguiente:
public void testSave2 () {session session = null; intente {session = getSession.getSession (); session.BeginTransaction (); Grupo grupo = nuevo grupo (); Group.SetName ("Power Node"); session.save (grupo); // Establezca el objeto de grupo aquí al objeto persistente user user1 = new User (); user1.setName ("Zhang San"); user1.setGroup (grupo); Usuario user2 = new User (); user2.setName ("li si"); user2.setGroup (grupo); session.save (usuario1); session.save (user2); // Los datos se pueden guardar correctamente // porque el grupo y el usuario son objetos en estado persistente // El objeto asociado se puede encontrar en la sesión cuando Hibernate limpia el caché session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). Rollback (); } Finalmente {getSession.clossessession (sesión); }} 2. Mapeo en cascada
Además de convertir tanto el objeto de grupo como el objeto de usuario al objeto persistente mencionado anteriormente, también puede usar los atributos de mapeo en cascada en cascada, agregue el atributo en cascada en el atributo <Bose-to-oe> y copiarlo para ahorrar actualizaciones. Puede escribir en la base de datos cuando el objeto de grupo no está en el estado persistente. De esta manera, solo necesita establecer los atributos de grupo de los dos objetos de usuario al mismo objeto de grupo para lograr una relación de mapeo de muchos a uno. En este momento, el contenido correspondiente en user.hbm.xml es el siguiente código:
<? xml versión = "1.0"?> < -> <hibernate-mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id" /> <generador /> < /id> </class> </hibernate-mapping>
NOTA: Después de que Cascade esté configurada para guardar la actualización, se puede modificar, adición y eliminación en cascada a la base de datos, pero la operación de consulta de cascada específica no se puede hacer.
El método de archivo de configuración de prueba correspondiente es el siguiente:
// Cascade Cascade public void testSave3 () {session session = null; intente {session = getSession.getSession (); session.BeginTransaction (); Grupo grupo = nuevo grupo (); Group.SetName ("Power Node"); Usuario user1 = new User (); user1.setName ("Zhang San"); user1.setGroup (grupo); Usuario user2 = new User (); user2.setName ("li si"); user2.setGroup (grupo); session.save (usuario1); session.save (user2); // La transmisión de transmisión no se lanzó // porque se usa Cascade // Hibernate primero guardará el grupo de objetos asociado del usuario // grupo y el usuario son ambos objetos en session de estado persistente.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). Rollback (); } Finalmente {getSession.clossessession (sesión); }} 3. Sublimación comparativa
Los dos métodos también implementan un método de mapeo de muchos a uno, y los resultados son los mismos, pero son muy diferentes en la implementación. Ya sea que el primer o segundo tipo use <Baning-o-oNO> para agregar la etiqueta al archivo de asignación en muchos fines, y asigne el atributo de nombre de la etiqueta al valor de atributo del único extremo de la clase registrada por el archivo de asignación, completando así la asignación básica de muchos a uno, que es lo mismo. La diferencia es que la relación de mapeo directo no utiliza los atributos del campo Hibernate, que es más flexible en la implementación. No solo admite adición, eliminación y modificación, sino que también permite consultar; La segunda modificación en cascada en cascada adopta el método proporcionado por Hibernate. Este método solo admite suma, eliminación y modificación, y no admite la consulta.