Hibernate3:关于想一次性把设置了lazy load的对象一次性全部load回来的问题(关于HQL left join fetch的问题)

crab_hn 2006-03-18 01:49:52
我在项目里面使用了openSessionInView的模式,并把对象的子对象set全部加上了lazy load,
但是有一个特殊的需求需要一次性的构造一个Detached的对象,然后我想在DAO里面新建一个loadObjectById的方法可以返回一个Detached的对象(新建一个session,方法返回前关闭session)
但是hibernate的load方法是默认使用lazy load的,所以我就打算使用left join fetch来返回完整load的对象。
我的对象体系大概的代码如下:
class A
{
...
set bSet;
set cSet;
set dSet;
}
class B
{
...
set eSet
set fSet
}

class C
{
...
set gSet;

}

A 一对多 B C
我想一次性把A全部load出来

然后我看了hibernate的HQL文档照着写了下面的语句:
from A as a left join fetch a.bSet bset
left join fetch bset.eSet
left join fetch bset.fSet
left join fetch a.cSet cset
left join fetch cset.gSet
left join fetch a.dSet
where a.id = ?
可以正常运行但是去读取a的bSet cSet dSet的时候还是会出现lazy load的exception

我就试验了一下把其他的left fetch去到,只留下一个:
from A as a left join fetch a.bSet bset
where a.id = ?
这时候对bSet就能够正确的读取不会出现 lazy load的exception

是不是我构造的hql语句有错,哪位大侠帮帮我看看把

...全文
140 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saro 2006-03-18
  • 打赏
  • 举报
回复
Hql就是这么写的啊,我测试没问题的,你仔细看看输出的sql,是否把所有的数据都取出来了。

public void testLefJoinFetchQuery(){
Session session=sf.openSession();
String hql="select u from User u left join fetch u.roles r left join fetch r.permissions where u.id=?";
String uid="408fa6a909d998460109d99851640001";
Query query=session.createQuery(hql).setString(0,uid);
List list=query.list();
System.out.println("users.size=" + list.size());

session.close();

User user=(User)list.get(0);
System.out.println( "user.roles.size=" + user.getRoles().size());
Role role=(Role)user.getRoles().toArray()[0];
System.out.println( "user.role.rolename=" + role.getRolename());
System.out.println("user.role.permissions.size=" + role.getPermissions().size());
Permission perm=(Permission)role.getPermissions().toArray()[0];
System.out.println("user.role.permission.permissionname=" + perm.getPermissionname());
}

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧