cfg - java maven hibernate mysql
Hibernate: ¿Anulando EAGER de mapeo en HQL? (2)
El calificativo en este fragmento de Hibernate Docs implica que puede anular la pereza con ansioso, pero no al revés:
Si está utilizando la recuperación perezosa a nivel de propiedad (con instrumentación de bytecode), es posible forzar a Hibernate para que busque las propiedades perezosas en la primera consulta inmediatamente usando la función de captura de todas las propiedades.
Inusualmente, parece que puedes si utilizas la API de criterios para pasar de ansioso a perezoso. Simplemente llame a setFetchMode(FetchMode.LAZY)
en la unión relevante.
Es posible anular LAZY
en HQL usando LEFT JOIN FETCH
.
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
¿También es posible anular EAGER
? ¿Cómo?
Tuve una situación que, por razones históricas, tuvo un gran interés entre varias dependencias de uno a muchos. Con el paso de los años, muchos lugares llegaron a depender de él, por lo que fue difícil apagarlo. Sin embargo, en algunos casos, la búsqueda ansiosa estaba obstaculizando: por cada selección más grande en la tabla, generaría cientos de pequeñas subconsultas para cada una de las colecciones de cada uno de los objetos. Encontré una forma de solucionar esto, no anulando realmente la búsqueda ansiosa, pero para mí es igual de útil: simplemente cree una única consulta que haga todos los subpetches a la vez. Esto hará 1 consulta física a la base de datos, en lugar de hibernar a pie el gráfico de dependencia y generar 100s de consultas.
Así que reemplacé
Query q = session.createQuery("from Customer c");
por
Query q = session.createQuery("from Customer c " +
"left join fetch c.vats v " +
"left join fetch v.klMemos bk " +
"left join fetch bk.ferryKlMemos");
1 El cliente tiene muchos números de IVA, 1 número de IVA tiene muchos klmemos y así sucesivamente. La situación anterior solo buscaría a los clientes y la hibernación comenzaría a obtener cada una de las colecciones dependientes una por una. El segundo formulario cargará todo en una consulta nativa, y hibernará encontrará todo lo que necesita para completar las colecciones impacientes en el caché de objetos.
Tenga en cuenta que este enfoque también simula una búsqueda rápida de colecciones que están configuradas para ser perezosas, ya que está poblando todas las colecciones "perezosas" de una manera ansiosa (y eficiente).