Principio de funcionamiento de JAVA Hibernate y por qué usarlo
Introducción a Hibernate:
Hibernate es un marco de código abierto. Es un marco para el mapeo de asociaciones de objetos. Encapsula JDBC de manera liviana y nuestros programadores de Java pueden usarlo. Pensamiento orientado a manipular la base de datos.
interfaz central de hibernación
session: responsable de las operaciones CRUD de objetos persistentes
sessionFactory: responsable de inicializar la hibernación y crear objetos de sesión
configuración: Responsable de configurar e iniciar la hibernación, crear SessionFactory
Transacción: Responsable de las operaciones relacionadas
Interfaz de consultas y criterios: Responsable de ejecutar varias consultas a la base de datos
Principio de trabajo de hibernación:
1. A través de Configuración config = new Configuration().configure();//Leer y analizar el archivo de configuración hibernate.cfg.xml
2. .cfg
3. Cree SessionFactory a través de SessionFactory sf = config.buildSessionFactory();/ /
4.Session session = sf.openSession();//Abrir sesión
5.Transaction tx = session.beginTransaction();//Crear e iniciar transacción Transacción p >
6.datos de operación persistentes, operación de persistencia
7.tx.commit();//Enviar transacción
8. Cerrar sesión
9. Cerrar SesstionFactory
Por qué usar hibernación:
1. El código para el acceso JDBC a la base de datos está encapsulado, lo que simplifica enormemente el código tedioso y repetitivo de la capa de acceso a datos.
2. Hibernate es un marco de persistencia convencional basado en JDBC y una excelente implementación de ORM. Simplifica enormemente el trabajo de codificación de la capa DAO.
3. Hibernate utiliza el mecanismo de reflexión de Java en lugar del programa de mejora de código de bytes para lograr transparencia.
4. El rendimiento de hibernación es muy bueno porque es un framework liviano. La flexibilidad del mapeo es excepcional. Admite varias bases de datos relacionales y varias relaciones complejas, desde uno a uno hasta muchos a muchos.
¿Cómo retrasa Hibernate la carga? La diferencia entre get y load
1. Para el método get de Hibernate, Hibernate confirmará si los datos correspondientes a la identificación. existe, primero busque en el caché de la sesión y luego busque en el caché de segundo nivel. Si no, consulte la base de datos. Si los datos no están en la base de datos, se devolverá nulo. Esto es relativamente simple y no demasiado controvertido.
El punto principal a tener en cuenta es que en esta versión (bibernate3.2 o superior) el método get también buscará el caché de segundo nivel.
2. Cuando el método de carga de Hibernate carga el objeto de entidad, se discutirá en función de la configuración del atributo diferido a nivel de clase en el archivo de mapeo (el valor predeterminado es verdadero):
(1) Si es verdadero, primero busque en el caché de sesión para ver si el objeto correspondiente a la identificación existe. Si no existe, use la carga diferida para devolver el objeto de clase proxy de la entidad (la clase proxy es un. hija de la clase de entidad), generada dinámicamente por CGLIB). Cuando el objeto se utiliza realmente (excepto para obtener el OID), se consulta la caché de segundo nivel y la base de datos. Si no se encuentra ningún registro que cumpla las condiciones, se generará una excepción ObjectNotFoundException.
(2) Si es falso, será el mismo que el orden de búsqueda del método Hibernateget, excepto que si al final no se encuentra ningún registro que cumpla las condiciones, se lanzará una excepción ObjectNotFoundException.
Aquí hay dos diferencias importantes entre get y load:
Si no se encuentra ningún registro que cumpla con las condiciones, el método get de Hibernate devuelve nulo y el método de carga arroja una excepción ObjectNotFoundException.
El método load puede devolver una instancia de clase proxy sin datos de entidad cargados, mientras que el método get siempre devuelve un objeto con datos de entidad.
(Para los tipos de retorno de los métodos load y get: muchos libros dicen: "El método get siempre devuelve solo la clase de entidad", lo cual en realidad no es correcto.
Si el método get está en la sesión El objeto correspondiente a la identificación se encuentra en el caché. Si el objeto ha sido proxy antes, como si fue utilizado por el método de carga o fue retrasado por otros objetos asociados
cargado, entonces. se devolverá el objeto original. Un objeto proxy, no un objeto de clase de entidad. Si el objeto proxy no ha cargado datos de entidad (es decir, otros datos de atributos distintos de la identificación), consultará la caché o la base de datos de segundo nivel. cargar los datos.
, pero el objeto proxy aún se devuelve, pero los datos de la entidad se han cargado.)
En resumen, la diferencia fundamental entre get y load, en una palabra , hibernate considera los datos como el método de carga. Debe existir en la base de datos y puede usar el proxy de manera segura para retrasar la carga. Si se encuentra un problema durante el uso, solo puede generar una excepción; y para el método get, hibernate debe obtener los datos reales; de lo contrario, devuelve nulo.
¿Cómo implementar la relación entre clases en Hibernate (como: relación de uno a muchos, de muchos a muchos)
La relación entre clases se refleja principalmente en el table y table Para operar en la relación entre ellos, todos operan en objetos. Todas las tablas y clases se asignan juntas en nuestro programa. Usan muchos a uno, uno a muchos, muchos a- en el archivo de configuración. Muchos,
Hablemos del mecanismo de almacenamiento en caché de Hibernate:
La función del almacenamiento en caché de Hibernate:
Hibernate es un marco de capa de persistencia que a menudo accede a bases de datos físicas. para reducir la aplicación La frecuencia de acceso del programa a las fuentes de datos físicas, mejorando así el rendimiento de ejecución de la aplicación. Los datos en el caché son una copia de los datos en la fuente de datos física. La aplicación lee y escribe datos del caché en tiempo de ejecución. En un momento o evento específico, los datos en el caché y la fuente de datos física se sincronizarán. /p>
Categoría de caché de Hibernación:
La caché de Hibernación incluye dos categorías: caché de primer nivel de Hibernación y caché de segundo nivel de Hibernación
La caché de primer nivel de Hibernación también se denomina " Caché de sesión", que está integrado. Esto significa que mientras use la hibernación, debe usar el almacenamiento en caché de sesión. Dado que el ciclo de vida del objeto Sesión generalmente corresponde a una transacción de base de datos o una transacción de aplicación, su caché es un caché de alcance de transacción.
En el caché de primer nivel, cada instancia de una clase persistente tiene un OID único.
El caché de segundo nivel de Hibernate también se llama "caché de SessionFactory". Dado que el ciclo de vida del objeto SessionFactory corresponde al proceso completo de la aplicación, el caché de segundo nivel de Hibernate es un proceso o un clúster. caché amplia. Es posible que surjan problemas de concurrencia, lo que requiere la adopción de una estrategia de acceso concurrente adecuada que proporcione un nivel de aislamiento de transacciones para los datos almacenados en caché. La caché de segundo nivel es opcional y es un complemento configurable. De forma predeterminada, SessionFactory no habilitará este complemento.
¿Qué tipo de datos son adecuados para el almacenamiento en la caché de segundo nivel?
1 Datos que rara vez se modifican
2 Datos que no son muy importantes, se permiten datos concurrentes ocasionales
3 Datos a los que no se accederá concurrentemente
p>
4 Datos constantes
¿Datos que no son adecuados para el almacenamiento en la caché de segundo nivel?
1 Datos modificados con frecuencia
2. Los datos a los que se accede simultáneamente, como datos financieros, no están permitidos.
3 Con otros datos compartidos por la aplicación.
¿Cómo aplica Hibernate el almacenamiento en caché a los objetos de búsqueda?
Cuando Hibernate accede al objeto de datos según el ID, primero lo verifica desde el caché de primer nivel de la sesión; si no se puede encontrar, si el caché de segundo nivel está configurado, luego lo verifica desde el caché de segundo nivel; el caché de segundo nivel; si tampoco se puede encontrar, consulte la base de datos y coloque los resultados en el caché de acuerdo con el ID
Al eliminar, actualizar o agregar datos, el caché se actualiza en el al mismo tiempo
Hibernate administra la instancia de caché
Siempre que estamos administrando los cachés de Hibernate (Administrar los cachés), cuando pasamos un objeto al save(), update() o saveOrUpdate (), o utilice el método load(), get(), list(). Cuando el método iterate() o scroll() obtiene un objeto, el objeto se agregará al caché interno de la sesión.
Cuando posteriormente se llame al método flush(), el estado del objeto se sincronizará con la base de datos. Si no desea que se produzca esta sincronización, o está tratando con una gran cantidad de objetos y necesita administrar la memoria de manera eficiente, puede llamar al método evict() para eliminar estos objetos y sus colecciones del caché de primer nivel.
Método de consulta de hibernación
Sql, Criterios, composición de objetos
Hql:
Consulta de atributos
2. Consulta de parámetros, consulta de parámetros denominada
3. Consulta de asociación
4. Consulta de paginación
5. ¿Optimizando Hibernación?
1. Utilice asociación bidireccional uno a muchos en lugar de unidireccional uno a muchos
2 Utilice de forma flexible una asociación unidireccional uno a muchos
3. No es necesario uno a uno, reemplácelo con muchos a uno
4. Configure el caché de objetos, no use el caché de colección
5. para colecciones de uno a muchos y Establecer para colecciones de muchos a muchos
p>
6 Usar polimorfismo explícito en clases heredadas
7 Tener menos campos de tabla. , No tenga miedo de demasiadas asociaciones de tablas y tenga el soporte de caché de segundo nivel.
Pasos de desarrollo de hibernación:
Pasos de desarrollo
1) Configure el entorno
Introduzca el paquete jar más pequeño de Hibernate
Prepare el archivo de configuración de inicio Hibernate.cfg.xml
2) Escriba la clase de entidad (pojo) p>
3) Escriba el archivo de mapeo "User.hbm.xml" para la clase de entidad
en hibernate.cfg. Agregue entidades mapeadas a xml
4) Cree una biblioteca. tabla
5) Escribir clase de prueba
Obtener configuración
Crear SessionFactory
Abrir sesión
Iniciar transacción
Usar sesión para manipular datos
Enviar transacción
Cerrar recurso