Hibernate 的Fetch
来源:互联网 发布:中国对欧盟出口数据 编辑:程序博客网 时间:2024/05/17 04:31
大家都知道,在hibernate里为了性能考虑,引进了lazy的概念,这里我们以Parent和Child为模型来说明,
/** identifier field */
private Long id;
/** persistent field */
private List childs;
//skip all getter/setter method
}
/** identifier field */
private Long id;
/** persistent field */
private net.foxlog.model.Parent parent;
//skip all getter/setter method
}
在我们查询Parent对象的时候,默认只有Parent的内容,并不包含childs的信息,如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办? 这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确,但是大概是这个意思。
总值,fetch就是在代码这一层给你一个主动抓取得机会.
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了
有一个问题,使用Fetch会有重复记录的现象发生,我们可以理解为Fetch实际上不是为Parent服务的,而是为Child服务的.所以直接取Parent会有不匹配的问题.
参考一下下面的这篇文章
Hibernate集合初始化
======================================================================
update:以上有些结论错误,实际上在hibernate3.2.1版本下测试,可以不出现重复记录,
List list = (List)hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.createQuery(
"select distinct p from net.foxlog.model.Parent p inner join fetch p.childs"
);
return q.list();
}
});
//((Parent)(list.get(0))).getChilds();
System.out.println("list size = " + list.size());
for(int i=0;i<list.size();i++){
Parent p = (Parent)list.get(i);
System.out.println("===parent = " + p);
System.out.println("===parent's child's length = " + p.getChilds().size());
}
}
打印结果如下:
list size = 3
===parent = net.foxlog.model.Parent@1401d28[id=14]
===parent's child's length = 1
===parent = net.foxlog.model.Parent@14e0e90[id=15]
===parent's child's length = 2
===parent = net.foxlog.model.Parent@62610b[id=17]
===parent's child's length = 3
另外,如果用open session in view模式的话一般不用fetch,但首先推荐fetch,如果非用的话因为有N+1的现象,所以可以结合batch模式来改善下性能.
- Hibernate的Fetch
- Hibernate 的Fetch
- Hibernate的fetch
- 浅谈Hibernate的fetch
- Hibernate的Fetch
- Hibernate的fetch
- Hibernate的fetch
- 浅谈Hibernate的fetch
- Hibernate的fetch属性
- Hibernate的fetch
- Hibernate的fetch
- Hibernate的fetch
- Hibernate的fetch
- Hibernate的fetch
- Hibernate的fetch
- Hibernate的fetch (转)
- Hibernate的fetch (转)
- Hibernate的fetch (转)
- ASP中处理#include
- 开始在这里写点iPhone相关的内容吧
- CString转换为string的做法
- linux 设置固定IP
- 彻底解决J2ME中的中文问题
- Hibernate 的Fetch
- CStringList 复制
- 如何把HTML改为XHTML
- bstr判断
- Gridview 单击改变颜色及获取需要的值
- MPLS VPN 的基本配置(图解) 二
- unicode CString -> std::string
- DBHelper连接类
- xml特殊字符定义