2012-09-24 26 views
7

Creo que hay solo dos formas de cargar objetos usando Hibernate y que es una carga floja y una carga ansiosa. La carga diferida tiene sus propias ventajas, no está cargando muchos objetos, sino solo cuando los necesita. También aprendí que si desea obligar a cargar a todos los niños para un objeto, simplemente puede llamar al parent.getChildren().size(). Así que vamos a decir que tenemos los siguientes objetoscuándo usar Lazy loading/Eager loading en hibernate?

@Entity 
public class Customer{ 
public Set<Order> order; 
} 

@Entity 
public class Order{ 
} 

Asumamos que tenemos clientes que tiene pedidos en nuestro sistema y que podría haber más de una o incluso nula. Entonces mi pregunta es: ¿no es mejor usar siempre una carga ansiosa en este caso? necesitamos el tamaño o alguna información para la orden relacionada con el cliente. ¿Cuál es el beneficio de usar cargas perezosas en esta situación? ¿Hay algún beneficio?

Estoy tratando de entender dónde usar la carga lenta y dónde usar la carga ansiosa, aprecio mucho su visión.

Respuesta

19

Estoy tratando de entender dónde usar la carga lenta y dónde usar cargando con impaciencia, aprecio mucho su visión.

Aquí están algunas ideas:

1) Si se va a utilizar siempre algo (con seguridad), puede cargar ansiosos ella.
2) Relacionado con 1, si casi nunca vas a usar algo, cárgalo.
3) La carga diferida tiende a ser más útil cuando se trata de colecciones grandes.
4) Cargar cosas con entusiasmo reducirá los errores relacionados con la sesión, al costo potencial de un golpe de rendimiento.
5) Para modelos de datos complicados y/o bases de datos grandes, verás cómo funciona tu aplicación bajo carga y ajusta tus estrategias.
6) Es difícil hacerlo bien la primera vez. Haga lo que le parezca correcto, y no tema cambiar si es necesario.
7) Para grandes conjuntos de datos, es probable que termine escribiendo hql/consultas de todos modos, donde las correlaciones predeterminadas se pueden sobrescribir, por lo que perezoso vs ansioso no importará tanto.

Si cree en el n. ° 6, no se quede atrapado tratando de planificar demasiado, y cámbielo si es necesario.

WRT su ejemplo específico, probablemente escribiría un montón de consultas para acceder a los datos (impulsado por las necesidades de negocio adecuados, por supuesto)

1) Una consulta que carga el cliente, y deja a los pedidos en el db (por lo que la carga es lenta) a la que llamaría cuando necesite obtener información del cliente
2) Una consulta que carga el cliente y toda la información del pedido, para los casos en que lo necesito.En este caso, ignoraré la asignación predeterminada.

Con esas dos consultas en su lugar, en mis capas de servicio tengo las herramientas que necesito para hacer lo correcto en función del contexto de la situación.

+0

Estoy completamente de acuerdo, escribir dos consultas por separado es mucho mejor que usar la carga floja/ansiosa. Gracias por dejarlo en claro. –

+0

@hvgotcodes ¿Puedes explicar cómo lograr el punto n. ° 7? –

5

Este link responde perfectamente a su pregunta.

carga diferida se utiliza en los casos en que el tamaño entidad relacionada es enorme y no se requiere que se debe buscar cada vez que, por otro lado

debe utilizarse con un análisis adecuado

ansioso como se carga la relación cada vez que el principal entidad está cargada.

De modo que si una relación es absolutamente necesaria para el cálculo de lógica de negocios, debería pensar en hacer uso de la carga EAGER; La carga LAZY servirá a la mayoría de los casos y proporciona menos problemas de rendimiento.

Cuestiones relacionadas