Este artículo resume cuatro formas de resolver el problema de la carga perezosa de Hibernate en el proceso de aprendizaje de Hibernate.
La llamada carga perezosa se retrasa la carga, la carga retrasada.
¿Cuándo usar la carga perezosa? Solo puedo responder que cuando desee usar la carga perezosa, use la carga perezosa.
En cuanto a por qué necesitamos usar la carga perezosa, es obvio que cuando la cantidad de datos que queremos acceder es demasiado grande, obviamente no es adecuado para usar caché, porque la capacidad de memoria es limitada. Para reducir la cantidad de concurrencia y reducir el consumo de los recursos del sistema, dejamos que los datos se carguen cuando sea necesario, y luego usamos la carga perezosa.
Por ejemplo, hay un objeto que es el empleado y otro objeto que es el departamento. Obviamente, para los empleados, es una relación de muchos a uno en comparación con el departamento, y para el departamento, es una relación de uno a muchos en comparación con los empleados. Cuando consultamos el objeto del empleado, si queremos consultar el departamento correspondiente a través del departamento de propiedad del objeto del empleado, se lanzará una excepción. Esto se debe a la existencia de carga perezosa. Después de que se cierra la sesión, Hibernate emite otra solicitud a la base de datos, y se lanza una excepción.
Las siguientes son cuatro formas de resolver este problema:
1. Inicialización explícita (dentro del método de consulta)
Al preguntar a qué departamento pertenece un empleado, debe pre-Quera el departamento
Declaración de uso
Hibernate.initialize (Departamento.Class);
2. Modifique el archivo de relación de objetos y reescribe Lazy Lazy = False, es decir, Cerrar la carga perezosa
Los dos métodos anteriores pueden resolver el problema, pero la desventaja es que, sin importar si el objeto se usa más adelante, Hibernate emitirá declaraciones SQL a la base de datos para solicitar datos, causando desechos de rendimiento innecesario.
3. Use filtros (proyecto web)
① La forma de obtener la sesión debe usar GetCurrentsession
② Método de sesión de cierre especial
Public void dofilter (solicitud de servletRequest, respuesta servletResponse, filterchain arg2) lanza ioexception, servletException {// tODO método generado automático sesion session = null; Transacción tx = nulo; intente {session = hibernateUtil.getCurrentSession (); tx = session.beGinTransaction (); arg2.dofilter (solicitud, respuesta); // Las solicitudes van constantemente tx.commit (); } catch (Exception e) {// tODO: manejar excepción if (tx! = null) {tx.rollback (); }} finalmente {// método de cierre especial hibernateUtil.CloseCurrentSession (); }}4. En el marco SSH, use OpenSessionView proporcionado por Spring
El principio es similar al uso del filtro en el tercer método, excepto que este filtro es proporcionado por Spring. Al usarlo, solo necesita configurarlo en el archivo web.xml de la siguiente manera:
<!-Use el resorte para resolver problemas de carga perezosa-> <filter> <filter-name> OpenSessionInviewFilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessionInviewFilter </filter-class> </filter> <filter-mapping> <filter-name> OpenSessionViewFilter </filter-name> <Url-Pattern>/*</url-Pattern> </filt-mapping>
Los métodos en 3 y 4 también pueden resolver el problema de la carga perezosa, y el cuarto método también se usa con mayor frecuencia en la actualidad. Sin embargo, estos dos métodos también tienen desventajas. La desventaja es que prolongan el tiempo en que la sesión está cerrada y el ciclo de vida de la sesión se hace más largo. Antes de usar este método, la sesión se cerró después de consultar datos; Ahora, la sesión está cerrada al final de una solicitud web.
Resumir
Lo anterior se trata de las cuatro formas de resolver el problema de la carga perezosa de hibernado. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!