遭遇hibernate中的lazy 懒加载异常

本文深入探讨了Hibernate中懒加载机制的使用方法及注意事项,特别是针对一对多关系中懒加载可能出现的问题及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ibernate中,如果在映射对象关系的时候,在一对多中(process->nodes)如果设置了lazy load(懒加载),

例如:

@Entity
@Table(name = "CUS_PROCESS_NEW")
public class CusProcess {
        // 过程中的节点
	private List<CusNode> nodes;
         @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "process")
	@Cascade( org.hibernate.annotations.CascadeType.DELETE_ORPHAN )
	public List<CusNode> getNodes() {
		if (nodes == null) {
			nodes = new ArrayList<CusNode>();
		}
		return nodes;
	}
        public CusNode startNode(){
		if (nodes != null && nodes.size()>0) {
			return nodes.get(0);
		}else{
			return null;
		}
	}

那么根据process得到nodes时,需要特殊处理。或者在上面的class文件中定义fetch = FetchType.EAGER,或者在取得cusprocess对象时,强迫加载一下nodes

如下:

public CusProcess getCusProcess(Integer processId) {
		if (processId == null) {
			return null;
		}
		CusProcess result=session.get(CusProcess.class, processId);
		//读取一下startNode避免懒加载错误。
		result.startNode();
		return result;
}

 

Hibernate 的强大之处之一是懒加载功能,可以有效的降低数据库访问次数和内存使用量。但用的不好就会出现org.hibernate .LazyInitializationException。

这个异常出现的原因很简单,主要时在加载懒数据时Session已经关闭造成的。

 

例如:

在一个类中用下面的代码:

protected void createCusForm() { 
      CusRequest cusRequest = auditSvc.createRequest(name, procId,bsMgr.getBsEmployeeById(empId),
					null,true,null,null,true);
      Integer startNodeId = cusRequest.getProcess().startNode().getId();
}
 

其中的createRequest是一个@Transactional,里面有代码:

final CusProcess process = compDao.getCusProcess(processId);

这样在 createRequest完成后,事物完毕,session也关闭,在下面的

 cusRequest.getProcess().startNode()时就会出错,因为懒加载方法没有加载nodes。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值