为什么当我在我的映射文件上设置lazy = true时,我会得到这个错误,但是当我设置它为false时,它就正常工作了……
>>org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.citi.tablero.contraloria.planes.model.db.hibernate.dto.SigTcContraloriaObjetivos.children, no session or session was closed
>> at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
>> at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
>> at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
>> at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
>> at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186)
>> at org.citi.tablero.contraloria.planes.model.db.hibernate.dao.TableroContraloriaPlanesOperativosDAO.getIndicadores(TableroContraloriaPlanesOperativosDAO.java:47)
>> at org.citi.tablero.contraloria.planes.ctrl.IndexCtrl.onCreateTree(IndexCtrl.java:59)
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>> at java.lang.reflect.Method.invoke(Unknown Source)
>> at org.zkoss.zk.ui.select.Selectors$ComposerEventListener.onEvent(Selectors.java:681)
>> at org.zkoss.zk.ui.AbstractComponent.onEvent(AbstractComponent.java:2742)
>> at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2713)
>> at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:2654)
>> at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:136)
>> at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:534)
>> at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:461)发布于 2013-06-07 01:34:54
您正在访问属性(已为其执行了lazy = true),这会触发属性的延迟加载,但实体本身处于分离状态(这意味着它不在hibernate会话中)。
对于hibernate延迟加载,实体本身的属性应该是hibernate会话(即实体应该处于持久状态)。
解决方案是让hibernate在会话直接(或间接作为事务完成的结果)关闭之前加载它。否则,当打开另一个会话时,您将不得不再次使其持久(这就是merge()方法的用途)。或者,在新打开的会话中重新加载实体(为此,您可以使用load()方法)。
发布于 2013-06-07 01:28:48
因为您可能是从事务外部调用getter。延迟加载只能从与加载实体相同的事务内部工作。你在其上调用延迟getter的实体必须由entitymanager管理。
发布于 2013-06-07 01:29:28
您正在尝试使用未加载的实体的属性,并且需要打开会话才能执行此操作。
https://stackoverflow.com/questions/16968410
复制相似问题