Hibernate : Lazy vs Left Join Fetch

Respondiendo en foros, me encontré una pregunta respecto a Hibernate.

Pregunta :

Tengo dos clases:


public class A {
private int id;
private String nombre;
private String apellidoP;
private String apellidoM;
private B b;

//getters y setters........

}

public class B {
private int id;
private String nombre;
private String apellidoP;
private String apellidoM;

//getters and setters.......

}

dos tablas
Tabla:
A
Campos:
id, nombre, apellidoP, apellidoM, id_b

Tabla:
B
Campos:
id, nombre apellidoP, apellidoM


cuando hago la consulta de todos los registros de la clase A, me trae una lista de objetos A, pero en la clase A tengo un objeto B, pero este objeto no trae nada, esta en null, y necesito que venga tambien lleno


Respuesta :

1) usando left join fetch :

tu hql sería:

String hql = "select claseA from A claseA left join fetch claseA.b claseB";


o

2) usando lazy="false"

en el archivo hbm de A donde está el many-to-one, agregar el lazy="false" :
(bueno no se cual será el package por mientras [com.4cuatros.java])


<many-to-one class="com.4cuatros.java.B" lazy="false" fetch="join" name="b">


y tu hql será :

String hql = " from A ";


si lo haces de esta forma, Hibernate hará un segundo query por debajo para traer "B" y lo hará cada vez que hagas select a "A".

¿Cual es mejor? depende de tus necesidades, tal vez no siempre quieres que esté ligado a "B". Notarás que la primera forma es más veloz.


el link del foro es Consulta HQL

Comentarios

Unknown ha dicho que…
hola me llamo nicolas, y te hago una consulta con respecto a tu post, estoy trabajando con hibernate y me surgió una duda ( soy principiante) , que pasa si quiero traer a una grilla los datos las ambas clases y por ejemplo hacer click en algun campo de esa grilla ,modificarlo y que guarde en la BD? Es decir que se guarde en la BD en ambas tablas eso que consulté previamente? bueno no se si se entendió la pregunta desde ya muchas gracias!!
Anónimo ha dicho que…
Si el objeto en su interior tiene otro objeto como se encuentra en el ejemplo, solo bastaría con realizar update [getHibernateTemplate().update(entity)]
Pero si en su interior tiene un set, agregar en el hbm cascade="save-update".

Ejemplo:

<set name="roleMenuOptions" table="ROLE_MENU_OPTION" lazy="false" cascade="save-update">
ablogator ha dicho que…
Muchas gracias, me ha servido de orientación.
Roodschild, Matías ha dicho que…
Hola Soy nuevo con hibernate.. y tengo una duda cuando uno pone el Lazy = "false", puede ser que hibernate haga la siguiente consulta en cadena: A trae B, B trae C, C trae D, D trae E y asi indefinidamente? o solo trae el primer subobjeto? desde ya muchas gracias :)