为什么在我的映射文件中设置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)
答案 0 :(得分:1)
您正在访问属性(已完成lazy = true
)并触发属性的延迟加载,但实体本身处于分离状态(意味着它不在休眠会话中)。
对于hibernate延迟加载,实体本身应该是一个hibernate会话的属性(即实体应该是持久状态)。
解决方案是让hibernate在会话直接关闭之前加载它(或者由于事务完成而间接关闭)。否则,您必须在打开另一个会话时再次使其持久化(这就是merge()
方法的用途)。或者,在新打开的会话中重新加载实体(为此,您可以使用load()
方法)。
答案 1 :(得分:0)
因为您可能是从交易外部调用getter。延迟加载仅适用于与加载实体的同一事务内部。你称之为惰性getter的实体必须由entitymanager管理。
答案 2 :(得分:0)
您正在尝试使用未加载的实体属性,并且需要一个开放会话来执行此操作。
答案 3 :(得分:0)
Clean解决方案是在hibernate.cfg.xml文件中将此属性设置为true
<property name="hibernate.enable_lazy_load_no_trans">true</property>