您的位置:首页 > 大数据 > 人工智能

failed to lazily initialize a collection of role: no session or session was closed (Hibernate) 解决方法(延迟加载问题)

2010-12-15 12:11 921 查看
在学着编写OA 权限管理时,在jsp 页面中通过已取得的 父模块来获取该模块的所有子模块

JSP 代码片段:

<c:forEach items="${modules}" var="module">

<c:forEach items="${module.children}" var="child">

<td> ${child.name }</td>

java 代码:

@OneToMany(mappedBy="parent")

public Set<Module> getChildren() {

return children;

}

在这段代码中没有对延迟加载进行设置,在JSP页面显示时报了failed to lazily initialize a collection of role: no session or session was closed (Hibernate) 的错误。

通过BAIdu 一下,发现我犯了延迟hibernate 延迟加载方面的错误。

修改代码后

@OneToMany(mappedBy="parent", fetch = FetchType.EAGER)

public Set<Module> getChildren() {

return children;

}

Hibernate: select module0_.id as id3_, module0_.name as name3_, module0_.orderNum as orderNum3_, module0_.parentId as parentId3_, module0_.sn as sn3_, module0_.url as url3_ from Module module0_ where module0_.parentId is null limit ?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id3_0_, children0_.name as name3_0_, children0_.orderNum as orderNum3_0_, children0_.parentId as parentId3_0_, children0_.sn as sn3_0_, children0_.url as url3_0_ from Module children0_ where children0_.parentId=?

虽然这种方式在查找模块时会进行大量的SQL操作,但在本次实践中作为一个练习是可行的。

页面显示正常,能够获取到该模块的子模块。通过查看hibernate打印出的sql 语句,可以看出hibernate在取出父模块的同时也将其关联的子模块全部取出。

为了验证 @OneToMany(mappedBy="parent", fetch = FetchType.LAZY)

public Set<Module> getChildren() {

return children;

}

是否能够取得理想效果,我修改了代码后,JSP 页面仍然报同样的错误,提示不能加载子模块。

虽然设置了延迟加载,如果是在java 代码中应该可以实现延迟加载功能。但是在这里,使用jsp 页面调用的方式,Action 将参赛传递到JSP页面中后,session 已经关闭,而JSP页面中的modules 是通过session 从Action中获取的。在session 已经关闭时,希望通过modules 延迟加载(也就是重新发SQL 语句到数据库中取到其子模块的实体类) 是不可能实现的。

查看hibernate 打印的sql 语句证实了其只能查询出该实体类本身的属性,而不能查询出与其关联的属性

Hibernate: select module0_.id as id3_, module0_.name as name3_, module0_.orderNum as orderNum3_, module0_.parentId as parentId3_, module0_.sn as sn3_, module0_.url as url3_ from Module module0_ where module0_.parentId is null limit ?

为了弄清楚延迟加载,又baidu了一把,总结下延迟加载:

A,实体对象的延迟加载: 通常在用 load() 方法时使用。此时返回的是实体类的代理类。而在对该实体类进行操作时,hibernate才会去数据库获取真正的实体类对象

B,集合类型的延迟加载: 就是本文提到的父模块与子模块之间的关系,在这里提醒一下,在实体类中定义子对象集时,必须使用set 集合。

C, 属性延迟加载: 通常对某个实体类进行细分,设置该实体类的某些属性为延迟加载,但需要对这些属性进行操作时,才去读取这些属性在数据库中的column 值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐