0

I have an object WorkbookMapping, which contains a List of objects SpreadsheetMapping, and each of those objects have another list of objects CellMapping, thus, Inception. When I try to access the List size of the CellMapping List inside the SpreadsheetMapping object, i get this error:

>Exception occurred in target VM: illegal access to loading collection 
org.hibernate.LazyInitializationException: illegal access to loading collection
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
at csheets.io.SpreadSheetMapping.getSpreadSheet(SpreadSheetMapping.java:49)
at csheets.io.WorkbookMapping.getWorkbook(WorkbookMapping.java:49)
at csheets.io.XMLCodec.read(XMLCodec.java:69)
at csheets.CleanSheets.load(CleanSheets.java:178)
at csheets.ui.ctrl.OpenAction.actionPerformed(OpenAction.java:85)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

This is my method of WorkbookMapping:

public Workbook getWorkbook() throws FormulaCompilationException{
    Workbook workbook = new Workbook();
    for(int i=0;i<this.list.size();i++){
        workbook.addSpreadsheet();
    }
    for(int i=0;i<this.list.size();i++){
        System.out.println("Spreadsheet size: "+this.list.size());
        this.list.get(i).getSpreadSheet();
    }

    //        Cell c = wkm.list.get(i).list.get(j).getCell(wkm.list.get(i).list.get(j));
    //        workbook.getSpreadsheet(i).getCell(c.getAddress()).setContent(c.getContent());       
    return workbook;
}

And this is my method in SpreadSheetsMapping:

public Spreadsheet getSpreadSheet(){
    System.out.println("Size: "+this.list.size());

    Spreadsheet ss=null; //= (Spreadsheet) ssm;
    return ss;
}

I just can't figure out what the problem is. Any idea? :/

Adam Silva
  • 1,013
  • 18
  • 48

1 Answers1

1

You're trying to use a lazy collection outside of a session. Either make it non-lazy, or load the collection inside the original session, or re-attach the objects and load it when you need it, or use something like an open session in view filter, or... which makes the most sense depends on your specific needs, application, etc.

Groot
  • 13,943
  • 6
  • 61
  • 72
  • This is my session code: SessionFactory sesFac=HibernateUtils.newSessionFactory(); Session ses=sesFac.openSession(); WorkbookMapping wk; List query = ses.createQuery("FROM Workbook").list(); wk =(WorkbookMapping)query.get(query.size()-1); System.out.println("Size: "+wk.list.get(0).list.size()); that last system out doesnt run – Adam Silva Jun 15 '13 at 23:45
  • I never close the session, and I'm even trying to access the content of the list 3 lines after I open the session – Adam Silva Jun 15 '13 at 23:51