2012-01-24 27 views
6

Tôi đã thấy loại sự cố này trên Stackoverflow nhưng không có gì có thể giúp tôi giải quyết vấn đề của mình.Hibernate, Java: không có phiên hoặc phiên nào được đóng

Tôi là người mới trong Hibernate và có một dự án được thực hiện trong Java và MySQL, và do đó sử dụng ngủ đông. Tôi quản lý để đạt được dữ liệu của tôi, để sửa đổi chúng, để xóa, nhưng tôi chặn trên một phương pháp vì tôi có một ngoại lệ mà đến .. Và thấy rằng tôi hiểu vẫn không phải tất cả các chủ đề tôi quản lý không để loại bỏ lỗi này:

đây là lỗi của tôi:

org.hibernate.LazyInitializationException Grave: thất bại trong việc uể oải khởi tạo một tập hợp các vai trò: DAO.User.files, không có phiên làm việc hoặc phiên đã được đóng org.hibernate.LazyInitializationException: thất bại để lười biếng khởi tạo một tập hợp vai trò: DAO.User.files, không có phiên hoặc phiên nào bị đóng tại org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358) tại org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350) tại org.hibernate.collection.AbstractPersistentCollection.initialize (AbstractPersistentCollection .java: 343) tại org.hibernate.collection.PersistentSet.add (PersistentSet.java:189) tại DAO.UserDAO.removeGroupAddUserFiles (UserDAO.java:252) tại javaapplication5.JavaApplication5.main (JavaApplication5.java:37)

Và đây là các lớp Java của tôi:

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

Mã của tôi là dư thừa, tôi biết anh ta (nó), nó là exac để tránh vấn đề của phiên đã đóng.

Phiên đóng trong dòng:

U.getFiles() .add (f);

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

tôi đặt một màn hình của session.isOpen() ở khắp mọi nơi trong mã của tôi cũng như một vật thử với lỗi. Chương trình như vậy tiếp tục, và cho thấy tôi có hệ thống đúng, cho dù đó là trước hoặc sau khi ngoại lệ!

+0

Bạn đã thử xem liệu phương thức 'User u = itUser.next();' trong phương thức removeGroupAddUserFiles có được gắn vào phiên trước khi thực hiện 'u.getFiles(). Add (f);'? – Faton

+0

Không, tôi đã không cố gắng vì tôi không biết làm thế nào để thấy rằng: S ... – algelos

Trả lời

10

Vấn đề chung là: bạn mở giao dịch, tạo đối tượng Hibernate với FetchTypeLAZY. Hibernate tạo proxy cho bộ sưu tập, sẽ tải các đối tượng vào lần sử dụng đầu tiên của bộ sưu tập. Bạn đóng giao dịch và cố truy cập bộ sưu tập đó. Phiên Hibernate đã hết hạn, vì giao dịch bị đóng, vì vậy bạn gặp lỗi.

Bạn nên thiết kế lại mã của mình để không bao giờ trả lại đối tượng bằng proxy được phân tách khỏi khối giao dịch. Bạn nên tải bộ sưu tập hoặc evict đối tượng từ phiên hoặc không ánh xạ bộ sưu tập một cách tự động (loại bỏ chúng khỏi POJO).

+4

Tôi không thực sự hiểu những gì bạn có nghĩa là, bạn có thể chỉ cho tôi một ví dụ trong mã của tôi? Tôi thực sự là một noob với Hibernate – algelos

+0

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

2

Nếu bạn lưu trữ các thực thể proxy hibernate của bạn trực tiếp trong ứng dụng của bạn thì chúng sẽ có sẵn cho đến khi phiên hoạt động. sau khi phiên bị đóng, bạn không thể truy cập các thực thể này. nếu bạn cố gắng truy cập chúng sau khi giao dịch kết thúc, bạn sẽ có được điều này

org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException 

Vì vậy, nó luôn luôn là tốt hơn để tạo một bản sao tươi của bạn tổ chức proxy, nếu bạn đang intented để sử dụng chúng sau khi đóng giao dịch.

-2

Bằng cách thực hiện dòng follwing vào tệp web.xml, chúng tôi có thể khắc phục ngoại lệ 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> 

truy cập: http://blog.gmorales.net/2012/03/how-to-solve-orghibernatelazyinitializa.html?

Các vấn đề liên quan