错误Hibernate属性“懒惰”

时间:2013-06-06 17:25:45

标签: java hibernate jpa hql

为什么在我的映射文件中设置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 个答案:

答案 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>