Fetch:
在我们查询Parent对象的时候,默认只有Parent的内容,并不包含childs的信息,如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办? 这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确,但是大概是这个意思。
总值,fetch就是在代码这一层给你一个主动抓取得机会.
Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.createQuery(
"from Parent as parent "+
" left outer join fetch parent.childs " +
" where parent.id = :id"
);
q.setParameter("id",new Long(15));
return (Parent)q.uniqueResult();
}
});
Assert.assertTrue(parent.getChilds().size() > 0);
你可以在lazy="true"的情况下把fetch去掉,就会报异常. 当然,如果lazy="false"就不需要fetch了
个人感觉应该是lazy这个属性的原因
解决你的方法步骤
1:修改你的
public static Depart queryDepart(int departId){
Session s = HbnUtil.getSession();
Depart depart=(Depart)s.get(Depart.class, departId);
Set s = depart.getEmps();//修改部分,立即查询员工
return depart;
}
这时候如果能打印出来查找员工的SQL语句就更能说明是lazy这个属性在作怪了
这样我们就这样修改
反正具体我看你这表达意思就是想根据书名获取到这本书是谁的既然是根据主外键那麽就简单了
hibernate.hbm.xml配置文件里面找到many
to
one这个然后加个lazy="false"
这样你book类里面不是存的是user类吗
你页面获取的时候
直接${book.User.username}就ok了
不过这样的缺点就是耗资源
至于你那个异常就是因为默认的lazy=true了
不延迟加载所以查不到
不能初始化代理
session已经关闭了
方法没问题
如果要这样lazy=false让它延迟加载就ok了
楼上的过滤器很好
网上也有资料
个人感觉应该是lazy这个属性的原因
解决你的方法步骤
1:修改你的
public
static
Depart
queryDepart(int
departId){
Session
s
=
HbnUtil.getSession();
Depart
depart=(Depart)s.get(Depart.class,
departId);
Set
s
=
depart.getEmps();//修改部分,立即查询员工
return
depart;
}
这时候如果能打印出来查找员工的SQL语句就更能说明是lazy这个属性在作怪了
这样我们就这样修改
table="depart">
column="id">
/>
column="name"
/>
cascade="all"
lazy="false">
/>
/>
因为你开户了lazy加载。。
为了效率,hibernate不会去加载关联表的数据,但你get关联表数据时,才发sql请求,这也是hibernate非常好的地方这里....