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。