1

为什么我在映射文件上设置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)
4

4 回答 4

1

您正在访问该属性(您已经完成了该属性lazy = true)并触发了该属性的延迟加载,但实体本身处于分离状态(意味着它不在休眠会话中)。

对于休眠延迟加载实体本身应该是一个休眠会话的属性(即实体应该处于持久状态)。

解决方案是在会话直接关闭(或由于事务完成而间接关闭)之前让休眠加载它。否则,您必须在打开另一个会话时再次使其持久化(这就是该merge()方法的用途)。或者,在新打开的会话中重新加载实体(为此,您可以使用该load()方法)。

于 2013-06-06T17:34:53.687 回答
0

因为您可能正在从事务外部调用 getter。延迟加载仅在与加载实体的同一事务内部有效。而你称之为惰性吸气剂的实体必须由实体管理器管理。

于 2013-06-06T17:28:47.830 回答
0

您正在尝试使用未加载的实体属性,并且需要打开会话来执行此操作。

于 2013-06-06T17:29:28.423 回答
0

干净的解决方案是在 hibernate.cfg.xml 文件中将此属性设置为 true

<property name="hibernate.enable_lazy_load_no_trans">true</property>
于 2013-06-06T17:29:37.357 回答