Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate y carga de objetos relacionados

Estas en el tema de Hibernate y carga de objetos relacionados en el foro de Java en Foros del Web. Hola como estan, queria realizarles una pregunta. Estoy persistiendo 2 entidades una MAquina y la otra Reparacion, donde una maquina puede tener una o muchas ...
  #1 (permalink)  
Antiguo 12/06/2012, 12:44
 
Fecha de Ingreso: agosto-2011
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Hibernate y carga de objetos relacionados

Hola como estan, queria realizarles una pregunta. Estoy persistiendo 2 entidades una MAquina y la otra Reparacion, donde una maquina puede tener una o muchas reparaciones, es uan relacion muchos a uno-->en hibernate <many-to-one>. Cuando yo quiero cargar todas las reparaciones que tengo en la BD los objetos Maquina son todos nulos,esto lo resolvi sin cerrar la conexion cuando traigo todos los objetos reparacion, ya que me tiraba una excepcion "org.hibernate.LazyInitializationException: could not initialize proxy - no Session", entonces mi pregunta es: ¿cuando debo cerrar esa session , o si nada mas espero hasta que el garbage collector lo elimine?..Este es el codigo que trae mis reparaciones desde la BD:

Código Java:
Ver original
  1. public List listOfObjects(Class hereditaryClass) throws Exception{
  2.             ArrayList<Object>  list = null;
  3.            
  4.             session = startTransaction();
  5.             try {
  6.                 Query query = session.createQuery("from " + hereditaryClass.getName());
  7.                 list = (ArrayList<Object>)query.list();
  8.                 //closeTransaction(session); ->no cierro la sesion y funciona
  9.             } catch (HibernateException e) {
  10.                 closeTransaction(session);
  11.                 throw new Exception();
  12.             }
  13.             return list;
  14.     }

Otra cosa que me olvide de poner es que el atributo lazy en el tag de hibernate <many-to-one/> lo tengo en false para que me traiga todo de una.Muhcas gracias por su tiempo.
  #2 (permalink)  
Antiguo 12/06/2012, 13:13
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Hibernate y carga de objetos relacionados

Hola:

Depende de la aplicación y lo que vayas a hacer con todo eso. Lo normal es dejarlo en lazy de forma que no te traiga todo por defecto (puedes llenar la memoria si tienes muchos datos y te descuidas).

Luego, cuando vayas a hacer una consulta concreta, decides si necesitas traerte todos los elementos de la relación o no y antes de cerrar la sesión los traes (basta con acceder a la lista de item relacionados para que hibernate la traiga), luego ya puedes cerrar la sesión sabiendo que esos datos están cargados. No sé si el exactamente así, pero sería algo como esto

crear sesion
maquina = sesion.consulta maquinas
maginas.getReparaciones().size() // esto inicializa la lista de reparaciones
sesion close

Echa un ojo también a http://docs.jboss.org/hibernate/orm/...rformance.html donde dice que Hibernate..initialize( maquina.getReparaciones() ) hace lo mismo pero queda el código un poco más claro (deja claro que es una inicialización y no una línea que aparentemente no hace nada).

La otra opcíon si controlas de base de datos, join y demás, es posible hacer la consulta concreta de forma que te traiga los elementos ("forzando" el eager aunque sea lazy por defecto), por ejemplo, si usas HQL, puede ser como esto (join fetch)

List list = session.createQuery(
"select c from Customer c left join fetch c.orders o " +
"left join fetch o.paymentMethod p").list();

o bien con la api de criteria en vez de HQL

List list = session.createCriteria(Customer.class)
.setFetchMode("orders", FetchMode.JOIN).list();

He sacado ambos trozos de código de aquí http://www.basilv.com/psd/blog/2008/...g-in-hibernate

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 12/06/2012 a las 13:32
  #3 (permalink)  
Antiguo 13/06/2012, 06:24
 
Fecha de Ingreso: agosto-2011
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Hibernate y carga de objetos relacionados

Gracias por contestar, estoy de acuerdo con que quizas se desborde la memoria pero la aplicacion no va a tener tantos datos como para que lo haga, en ese caso si voy a leer con l oque me pasaste de hibernate. Muchas gracias por la docuemntacion Saludos

Etiquetas: excepcion, hibernate
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:40.