English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo resume las cuatro formas en que resolví problemas de carga perezosa en Hibernate durante mi aprendizaje.
Se llama carga perezosa (lazy) a la carga diferida, la carga retrasada.
¿Cuándo se utiliza la carga perezosa? Solo puedo responder que se utiliza la carga perezosa cuando se necesita.
En cuanto a por qué usar la carga perezosa, es cuando la cantidad de datos que queremos acceder es demasiado grande, claramente no es adecuado usar la caché, ya que la capacidad de memoria es limitada. Para reducir la cantidad de concurrencia y el consumo de recursos del sistema, hacemos que los datos se carguen solo cuando se necesitan, en este momento es cuando utilizamos la carga perezosa.
Por ejemplo, hay un objeto que es Employee, y otro objeto es Department. Obviamente, para Employee en comparación con Department, es una relación de muchos a uno; mientras que para Department en comparación con Employee, es una relación de uno a muchos. Cuando se consulta el objeto Employee, si se desea obtener el Department correspondiente a través del atributo department del objeto employee, se lanzará una excepción. Esto se debe a la existencia de la carga perezosa, después de que la sesión se cierre, hibernate enviará una vez más una solicitud al banco de datos, lo que causará una excepción.}
A continuación, se resumen las cuatro formas de resolver este problema:
1.inicialización explícita (dentro del método de consulta)
Cuando se desea consultar a qué departamento pertenece un empleado determinado, se debe realizar una consulta previa a Department
usar la sentencia
Hibernate.initialize(Department.class);
2.modificar el archivo de relación de objetos, cambiando lazy a lazy=false, es decir, cerrar la carga perezosa
Ambos métodos, de hecho, pueden resolver el problema, pero tienen la desventaja de que hibernate siempre enviará una solicitud SQL al banco de datos, independientemente de si se utiliza el objeto después, lo que causará un desperdicio innecesario de rendimiento.
3.usar el filtro (proyecto web)
① La forma de obtener la sesión debe usar getCurrentSession
② Modo de cierre especial de sesión
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) lanza IOException, ServletException { // TODO Auto-esqueleto de método generado Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);//La solicitud sigue en movimiento tx.commit(); } catch (Exception e) { // TODO: manejar excepción if(tx != null){ tx.rollback(); } finally{ //Modo de cierre especial HibernateUtil.closeCurrentSession(); } }
4En el marco SSH, se utiliza openSessionView proporcionado por spring
Su principio es similar al tercer método utilizado con Filter, solo que este filtro es proporcionado por spring. Al usarlo, solo necesita configurar en el archivo web.xml como se muestra a continuación:
<!-- Solución de problemas de carga perezosa utilizando spring --> <filtro <filtro-nombre>OpenSessionInViewFilter</filtro-nombre> <filtro-clase>org.springframework.orm.hibernate3.soport.OpenSessionInViewFilter</filtro-clase> </filtro> <filtro-mapeo> <filtro-nombre>OpenSessionInViewFilter</filtro-nombre> <url-patrón>/*</url-patrón> </filtro-mapeo>
y el3y el4El método también puede resolver el problema de carga perezosa, entre ellos el4Estas dos formas también son muy utilizadas en la actualidad. Sin embargo, también tienen deficiencias, y estas deficiencias son que alargar el tiempo de cierre de la sesión, la vida útil de la sesión se ha extendido. Antes de usar este método, la sesión se cerraba después de la consulta de datos; ahora, el cierre de la sesión se realiza al final de una solicitud web.
Resumen
A continuación, se presentan algunas formas de abordar brevemente el problema de carga perezosa de Hibernate4Este artículo recopila todas las formas, espero que sean útiles para todos. Los amigos interesados pueden continuar consultando otros temas relacionados de este sitio, y si hay deficiencias, por favor déjenos un mensaje. Gracias a todos los amigos por su apoyo a este sitio!
Declaración: El contenido de este artículo se ha obtenido de la red, y pertenece a los propietarios originales. El contenido ha sido contribuido y subido por usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por ellas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @ para denunciar, y proporcione evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.)