2012-01-24 13 views
6

मैंने पहले से ही इस तरह की समस्या को स्टैक ओवरफ्लो पर देखा है लेकिन मेरी समस्या को हल करने में मुझे कुछ भी मदद नहीं कर सकता है।हाइबरनेट, जावा: कोई सत्र या सत्र बंद नहीं किया गया था

मैं हाइबरनेट में नौसिखिया हूं और जावा और माईएसक्यूएल में एक प्रोजेक्ट बनाना है, और इस प्रकार हाइबरनेट का उपयोग करें। मैं अपने डेटा तक पहुंचने में कामयाब रहा, उन्हें हटाने के लिए, लेकिन मैं एक विधि पर अवरुद्ध हूं क्योंकि मेरे पास एक अपवाद है जो आता है .. और देखा कि मैं अभी भी समझ नहीं पा रहा हूं कि मैं इस धागे को हटाने के लिए प्रबंधन नहीं करता हूं:

org.hibernate.LazyInitializationException कब्र:

यहाँ मेरी त्रुटि है DAO.User.files, कोई सत्र या सत्र बंद किया गया org.hibernate.LazyInitializationException: lazily भूमिका का एक संग्रह प्रारंभ करने में विफल असफल को आलसी शुरू करने के लिए भूमिका का संग्रह: DAO.User.files, कोई सत्र या सत्र पर बंद कर दिया गया थाorg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) पर org.hibernate.collection.AbstractPersistentCollection.initialize पर (AbstractPersistentCollection जावा: 343) org.hibernate.collection.PersistentSet.add (PersistentSet.java:189) पर javaapplication5.JavaApplication5.main पर DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) पर (JavaApplication5.java:37)

और यहाँ मेरी जावा वर्गों हैं:

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; 
    } 

मेरे कोड है अनावश्यक, मैं उसे जानता हूँ (यह), यह exac था बंद होने वाले सत्र की समस्या से बचने के लिए प्रयास करें। ;

U.getFiles() .add (च):

सत्र लाइन में बंद कर देता है

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

मैं session.isOpen का प्रदर्शन कर दिया() मेरी कोड के साथ ही त्रुटि के साथ एक कोशिश कुश्ती में हर जगह। इस प्रकार कार्यक्रम जारी है, और मुझे व्यवस्थित रूप से सच दिखाता है, भले ही यह अपवाद से पहले या बाद में हो!

+0

क्या आपने यह देखने की कोशिश की है कि 'user u = itUser.next();' हटाएं समूह में 'A.getFiles()। (U); (?) जोड़ने से पहले सत्र से जुड़ा हुआ है। – Faton

+0

नहीं मैंने कोशिश नहीं की क्योंकि मुझे नहीं पता कि यह कैसे देखना है: एस ... – algelos

उत्तर

10

सामान्य समस्या यह है कि: आप लेनदेन खोलते हैं, FetchTypeLAZY के साथ हाइबरनेट ऑब्जेक्ट बनाते हैं। हाइबरनेट संग्रह के लिए प्रॉक्सी बनाता है, जो संग्रह के पहले उपयोग पर वस्तुओं को लोड करेगा। आप लेनदेन बंद करते हैं, और उस संग्रह तक पहुंचने का प्रयास करते हैं। हाइबरनेट सत्र समाप्त हो गया है, क्योंकि लेनदेन बंद है, इसलिए आपको त्रुटि मिली है।

आपको अपने कोड को फिर से डिजाइन करना चाहिए ताकि लेनदेन ब्लॉक से प्रारंभिक प्रॉक्सी के साथ ऑब्जेक्ट कभी वापस न आएं। आपको सत्र से संग्रह या evict ऑब्जेक्ट लोड करना चाहिए या संग्रह को स्वचालित रूप से मानचित्रित नहीं करना चाहिए (उन्हें POJO से हटाएं)।

+4

मैं वास्तव में समझ नहीं पा रहा हूं कि आप क्या मतलब है, क्या आप मुझे मेरे कोड में एक उदाहरण दिखा सकते हैं? मैं वास्तव में हाइबरनेट – algelos

+0

org.hibernate के साथ एक नोब हूं। ट्रांज़ेक्शन tx = session.beginTransaction(); tx.commit(); –

2

यदि आप सीधे अपने आवेदन में अपनी हाइबरनेट प्रॉक्सी इकाइयों को स्टोर करते हैं तो वे सत्र लाइव होने तक उपलब्ध होंगे। एक बार सत्र बंद हो जाने पर, आप इन इकाइयों तक नहीं पहुंच सकते हैं। अगर आप को बंद करने लेन-देन के बाद उन तक पहुंचने की कोशिश करते हैं, तो आप इस

org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException 

तो यह हमेशा बेहतर है, तो आप प्रॉक्सी संस्थाओं की एक ताजा प्रतिलिपि बनाने के लिए आप लेन-देन बंद करने के बाद उन्हें इस्तेमाल करने intented रहे हैं मिल जाएगा।

-2

web.xml में follwing लाइन करके, हम 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> 

भ्रमण: http://blog.gmorales.net/2012/03/how-to-solve-orghibernatelazyinitializa.html?

संबंधित मुद्दे