2012-01-24 21 views
6

Ho già visto questo tipo di problema su Stackoverflow ma nulla potrebbe aiutarmi a risolvere il mio problema.Hibernate, Java: nessuna sessione o sessione è stata chiusa

Sono un principiante in Hibernate e ho un progetto da realizzare in Java e MySQL, e quindi utilizzare l'ibernazione. Sono riuscito a raggiungere i miei dati, a modificarli, a deletethem, ma blocco su un metodo perché ho un'eccezione che arriva .. E visto che capisco ancora non tutti i thread riesco a rimuovere questo bug:

Ecco il mio errore:

org.hibernate.LazyInitializationException Grave: impossibile inizializzare pigramente una collezione di ruolo: DAO.User.files, nessuna sessione o la sessione è stata chiusa org.hibernate.LazyInitializationException: fallito per inizializzare pigramente una raccolta di ruoli: DAO.User.files, nessuna sessione o sessione è stata chiusa allo org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) a org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) a org.hibernate.collection.AbstractPersistentCollection.initialize (AbstractPersistentCollection .java: 343) a org.hibernate.collection.PersistentSet.add (PersistentSet.java:189) a DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) a javaapplication5.JavaApplication5.main (JavaApplication5.java:37)

E Ecco le mie classi 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; 
    } 

Il mio codice è ridondante, lo conosco, era esatto cercare di evitare il problema della sessione chiusa.

La sessione chiude in linea:

U.getFiles() .add (f);

E 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(); 
    } 
} 

ho messo un display di session.isOpen() ovunque nel mio codice, nonché un wrestling prova con l'errore. Il programma continua così e mi mostra sistematicamente vero, sia prima che dopo l'eccezione!

+0

Si è tentato di vedere se l'utente 'User u = itUser.next();' nel metodo removeGroupAddUserFiles è collegato alla sessione prima di eseguire 'u.getFiles(). Add (f);'? – Faton

+0

No, non l'ho provato perché non so come vederlo: S ... – algelos

risposta

10

Il problema generale è: si apre la transazione, si crea oggetto Hibernate con FetchTypeLAZY. Hibernate crea il proxy per la raccolta, che carica gli oggetti al primo utilizzo delle raccolte. Chiudi la transazione e prova ad accedere a quella raccolta. La sessione di ibernazione è scaduta, perché la transazione è chiusa, quindi hai ottenuto un errore.

È necessario riprogettare il codice in modo da non restituire mai oggetto con proxy unitializzati dal blocco di transazione. È necessario caricare le raccolte o l'oggetto evict dalla sessione o non mappare la raccolta automaticamente (rimuoverle da POJO).

+4

Non capisco cosa intendi, potresti mostrarmi un esempio nel mio codice? Sono davvero un noob con Hibernate – algelos

+0

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

2

Se si archiviano le entità proxy di ibernazione direttamente nell'applicazione, saranno disponibili fino a quando la sessione non è attiva. una volta chiusa la sessione, non è possibile accedere a queste entità. se si tenta di accedervi dopo la transazione di chiusura, si ottiene questo

org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException 

quindi è sempre meglio fare una nuova copia di voi entità proxy, se si sta intented di usarli dopo la chiusura della transazione.

-2

Facendo follwing line in web.xml, è possibile correggere l'eccezione 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> 

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

Problemi correlati