2011-03-25 6 views
19

vi la siguiente declaración en el libro "hibernar en acción". cualquiera me puede decir cómo anular la estrategia en tiempo de ejecución. y ¿puedes hacer lo contrario? ¿Tengo la estrategia de búsqueda establecida como floja como falsa y quiero establecerla como verdadera?cómo anular la estrategia de recuperación de hibernación en tiempo de ejecución

"La extracción diferida le permite decidir qué cantidad del gráfico de objeto se carga en el primer hit de la base de datos y qué asociaciones se deben cargar solo cuando son las primeras accedidas. La recuperación diferida es un concepto fundamental en la persistencia de objetos y el primer paso para alcanzar un rendimiento aceptable es . Recomendamos que, para empezar, todas las asociaciones se configuren para la recuperación de perezoso (o quizás perezoso por lotes) en el archivo de asignación. Esta estrategia puede entonces ser anulado en tiempo de ejecución por las consultas de esa fuerza con ganas ir a buscar a producirse.”

Respuesta

30

Si está utilizando HQL para sus consultas, puede especificar su ansiosa ir a buscar utilizando la palabra clave 'fetch', al igual que :

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 criterios de consulta, puede especificar el modo de ir a buscar usando setFetchMode

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "Fritz%")) 
    .setFetchMode("mate", FetchMode.EAGER) 
    .setFetchMode("kittens", FetchMode.EAGER) 
    .list(); 
+3

Parece que Hibernate no está contento con que se agregue una 'búsqueda de unión izquierda' a menos que la entidad de destino aparezca en la lista de selección cuando se utilizan los criterios de JPA2. Produce el error "búsqueda especificada de obtención de unión, pero el propietario de la asociación recuperada no estaba presente en la lista de selección" si se agrega un root.fetch ("someChildProperty") para solicitar una búsqueda de unión izquierda. Ideas? JPA2 parece hacer que sea increíblemente difícil decir "busca esto de forma perezosa la mayor parte del tiempo, pero ansiosamente en esta única situación". –

+0

¡Muchas gracias! Muy apreciado, Andrew! –

-5

para la consulta ansiosos puede escribir algo como esto utilizando proveedor de LINQ:

List<Customer> customers = session.Query<Customer>().Fetch(c => c.Orders).ToList(); 

Esto llena todos los pedidos de los clientes inverosímiles en la consulta de un 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 

Puede buscar colecciones de nietos también (ver here).

+0

Esto es sobre Java, no C# – vvondra

Cuestiones relacionadas