2012-01-24 26 views
6

ya vi este tipo de problemas en Stackoverflow pero nada me podría ayudar a resolver mi problema.Hibernate, Java: no hay ninguna sesión o sesión se cerró

Soy novato en Hibernate y tienen un proyecto para ser realizado en Java y MySQL, y por lo tanto utilizar hibernación. Me las arreglé para llegar a mis datos, modificarlos, a deletethem, pero bloquear en un método porque tengo una excepción que llega .. Y visto que todavía no entiendo todos los hilos que administro no eliminar este error:

Aquí está mi error:

org.hibernate.LazyInitializationException grave: no se puede inicializar con pereza una colección de papel: DAO.User.files, no hay ninguna sesión o sesión se cerró org.hibernate.LazyInitializationException: no se pudo para inicializar perezosamente una colección de papel: DAO.User.files, no hay ninguna sesión o sesión se cerró al org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) en org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) en org.hibernate.collection.AbstractPersistentCollection.initialize (AbstractPersistentCollection .java: 343) en org.hibernate.collection.PersistentSet.add (PersistentSet.java:189) en DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) en javaapplication5.JavaApplication5.main (JavaApplication5.java:37)

Y aquí están mis clases Java:

public static void main(String[] args) { 
     GroupDAO grDAO = new GroupDAO(); 
     List[] lists = grDAO.removeGroup(grDAO.getGroupById(1)); 

     FileDAO fiDAO = new FileDAO(); 
     fiDAO.removeGroupAddFiles(lists); 

     UserDAO usDAO = new UserDAO(); 
     usDAO.removeGroupAddUserFiles(lists); 
    } 

GroupDAO.java:

public List[] removeGroup(Group group) { 
     Set<File> setFiles = group.getFiles(); 
     Set<User> setUsers = group.getUsers_1(); 
     List[] lists = new List[2]; 

     Iterator<File> itFiles = setFiles.iterator(); 
     Iterator<User> itUsers = setUsers.iterator(); 
     List<File> listFiles = new ArrayList<File>(); 
     List<User> listUsers = new ArrayList<User>(); 
     while (itFiles.hasNext()) { 
      listFiles.add(itFiles.next()); 
     } 
     while (itUsers.hasNext()) { 
      listUsers.add(itUsers.next()); 
     } 

     lists[0] = listUsers; 
     lists[1] = listFiles; 

     org.hibernate.Transaction tx = session.beginTransaction(); 
     session.delete(group); 
     tx.commit(); 

     return lists; 
    } 

FileDAO.java:

public List[] removeGroupAddFiles(List[] lists) { 
     System.out.println("5 : " + session.isOpen()); 
     System.out.println("6 : " + session.isOpen()); 
     Iterator<File> itFile = lists[1].iterator(); 
     System.out.println("7 : " + session.isOpen()); 

     org.hibernate.Transaction tx = session.beginTransaction(); 
     while (itFile.hasNext()) { 
      System.out.println("8 : " + session.isOpen()); 
      Iterator<User> itUser = lists[0].iterator(); 
      System.out.println("9 : " + session.isOpen()); 
      File f = itFile.next(); 
      while (itUser.hasNext()) { 
       System.out.println("10 : " + session.isOpen()); 
       System.out.println("11 : " + session.isOpen()); 
       User u = itUser.next(); 
       System.out.println("12 : " + session.isOpen()); 
       File fCopie = new File(u, f.getName() + "_" + u.getFirstName() + "_" + u.getLastName(), f.getExtension(), f.getSize(), f.getCreatedAt(), f.getUpdateAt()); 
       System.out.println("13 : " + session.isOpen()); 
       session.save(fCopie); 
       System.out.println("14 : " + session.isOpen()); 
      } 
     } 
     tx.commit(); 
     return lists; 
    } 

UserDAO.java:

public List[] removeGroupAddUserFiles(List[] lists) { 
     System.out.println("15 : " + session.isOpen()); 
     Iterator<User> itUser = lists[0].iterator(); 
     System.out.println("16 : " + session.isOpen()); 

     org.hibernate.Transaction tx = session.beginTransaction(); 

     while (itUser.hasNext()) { 
      System.out.println("17 : " + session.isOpen()); 
      Iterator<File> itFile = lists[1].iterator(); 
      System.out.println("18 : " + session.isOpen()); 
      User u = itUser.next(); 
      while (itFile.hasNext()) { 
       System.out.println("19 : " + session.isOpen()); 
       File f = itFile.next(); 
       System.out.println("20 : " + session.isOpen()); 
       try { 
        u.getFiles().add(f); 
       } catch (LazyInitializationException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("21 : " + session.isOpen()); 
      } 
      try { 
       session.update(u); 
      } catch (ConstraintViolationException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("22 : " + session.isOpen()); 
     } 
     tx.commit(); 
     return lists; 
    } 

Mi código es redundante, lo conozco, fue exac para intentar evitar el problema de la sesión que se cerró.

se cierra la sesión en la línea:

U.getFiles() .add (f);

Y HibernateUtil.java:

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
// load from different directory 
      SessionFactory sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory(); 

      return sessionFactory; 

     } catch (Throwable ex) { 
// Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    public static void shutdown() { 
// Close caches and connection pools 
     getSessionFactory().close(); 
    } 
} 

pongo una muestra de session.isOpen() en todas partes de mi código, así como la lucha libre intento con el error. El programa continúa así, y me muestra sistemáticamente verdadero, ¡ya sea antes o después de la excepción!

+0

¿Ha intentado ver si el 'Usuario u = itUser.next();' en el método removeGroupAddUserFiles está conectado a la sesión antes de hacer 'u.getFiles(). Add (f);'? – Faton

+0

No, no lo intenté porque no sé cómo ver eso: S ... – algelos

Respuesta

10

problema general es: que la transacción abierta, crear el objeto de Hibernate con FetchTypeLAZY. Hibernate crea un proxy para la colección, que cargará los objetos en el primer uso de las colecciones. Cierra la transacción e intenta acceder a esa colección. La sesión de Hibernate ha caducado porque la transacción está cerrada, por lo que ha recibido un error.

Debe volver a diseñar su código para que nunca devuelva objeto con proxies unificados fuera del bloque de transacción. Debe cargar las colecciones o el objeto evict desde la sesión o no asignar la colección automáticamente (eliminarlos de POJO).

+4

Realmente no entiendo lo que quieres decir, ¿podrías mostrarme un ejemplo en mi código? Soy realmente un novato con Hibernate – algelos

+0

org.hibernate.Transaction tx = session.beginTransaction(); tx.commit(); –

2

Si almacena sus entidades proxy de hibernación directamente en su aplicación, estarán disponibles hasta que la sesión esté activa. una vez que se cierra la sesión, no puede acceder a estas entidades. si se intenta acceder a ellos tras la operación de cierre, se consigue este

org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException 

lo que siempre es mejor hacer una copia nueva de ustedes entidades de proxy, si está intented para usarlos después de cerrar la transacción.

-2

Al hacer la siguiente línea en web.xml, podemos reparar la excepción LazyInitilization.

<filter> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

visite: http://blog.gmorales.net/2012/03/how-to-solve-orghibernatelazyinitializa.html?

Cuestiones relacionadas