hibernate - cómo anular la estrategia de recuperación de hibernación en tiempo de ejecución
(3)
Vi la siguiente declaración en el libro "hibernar en acción". cualquiera puede decirme cómo anular la estrategia en tiempo de ejecución. y ¿puedes hacer la forma opuesta en la que tengo una estrategia de recuperación configurada como falsa y quiero configurarlo como verdadero?
“La recuperación perezosa le permite decidir qué parte del gráfico de objetos se carga en el primer hit de la base de datos y qué asociaciones deben cargarse solo cuando se accede por primera vez. La recuperación perezosa es un concepto fundamental en la persistencia de objetos y el primer paso para lograr un rendimiento aceptable. Recomendamos que, para comenzar, todas las asociaciones se configuren para una búsqueda perezosa (o quizás un proceso paroso) en el archivo de mapeo. Esta estrategia puede entonces ser anulada en tiempo de ejecución por consultas que obligan a que se produzca una búsqueda ansiosa ".
Para la consulta impaciente puede escribir algo como esto usando el proveedor de LINQ:
List<Customer> customers = session.Query<Customer>().Fetch(c => c.Orders).ToList();
Esto llena todos los pedidos para todos los clientes buscados en una consulta SQL:
select
customer0_.CustomerId as CustomerId0_0_,
customer0_.ContactName as ContactN3_0_0_,
orders1_.CustomerId as CustomerId0__,
orders1_.OrderId as OrderId0__
orders1_.OrderDate as OrderDate3_1_,
from Customers customer0_
left outer join Orders orders1_
on customer0_.CustomerId = orders1_.CustomerId
También puede buscar colecciones de nietos (ver here ).
Si está utilizando HQL para sus consultas, puede especificar su búsqueda ansiosa utilizando la palabra clave "fetch", así:
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
Si está utilizando la API de consulta de criterios, puede especificar el modo de recuperación utilizando setFetchMode
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
Utilice los perfiles de búsqueda: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetching-profiles