`
fengshujuan
  • 浏览: 160356 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

遭遇hibernate中的lazy 懒加载异常

    博客分类:
  • java
阅读更多

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。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics