hibernate 经验谈(一)
来源:互联网 发布:sql删除字段语句 编辑:程序博客网 时间:2024/04/28 16:03
转载于:http://blog.csdn.net/qq413041153/article/details/7350342
以前仔细研究过hibernate,现在随着项目接触,也慢慢的有所深入,下面将自己的一些新的体会发出来。
1.尽量少用one-to-many的映射,如果用请把lazy设置成true,这样在查询主表时所有关联的子表就不会查询了,更不会浪费数据库的资源。
2. 如果lazy="true"时,如果需要(用Criteria或者DetachedCriteria)查询子表对象,则会抛出一个session closed的异常,因为查询完主表对象hibernate的session就已经关闭了,所以是查询不到的,如果想要查询子表对象,请在one-to-many的设置属性fetch="join",这说明只要查询时就去抓取子对象,是hibernate的一种抓取策略。
3.如果lazy="true"并且fetch="join"时,用QBC进行分页查询,会带来新的问题,fetch="join"是采用左外连接查询的,所以主表的数据就会出现很多重复记录,这时需在QBC条件对象加上一个去重的限制,具体代码为:
- criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
换句话说fetch是为子对象服务的,不适合主对象的查询操作.
4. 如果用HQL查询则一切正常,不用加去重操作,子对象也可以查询出来.
5. 如果lazy="false"时,并没有设置fetch属性,用HQL查询也会抛出一个sessin closed 异常,所以需要在HQL写上抓取子对象的关键字,例如:from main join fetch main.detail as detail,这样在获取子对象属性时就关采取抓取策略.
6. 在使用DetachedCriteria拼凑查询条件的时候,如何条件涉及到子对象的属性时,需要用DetachedCriteria.createAlias("b","b"),来建立映射关系,不然会下面这个异常
- org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property
假如:实体A中包含set<B>
当然添加实体之间的关联之后,会把B也加载出来,就算设置了延迟加载也没用。
说所以说为了性能 在拼凑查询条件的时候能不设置关联就不关联。
- hibernate 经验谈(一)
- hibernate 经验谈(一)
- hibernate 经验谈(一)
- hibernate 经验谈(一)
- 经验谈一(引)
- hibernate经验谈
- hibernate 经验谈
- hibernate 经验谈
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 项目开发经验谈(一)
- 系统设计经验谈(一)
- 数据库设计经验谈 (一)
- 数据库设计经验谈 一 (引)
- shut down, restart, sleep keyboard short cut
- HINSTANCE/HWND/CWnd/HANDLE 的区别
- Common Language Runtime detected an invalid program
- C++是如何利用虚函数实现多态性的?
- android平台下使用点九PNG技术
- hibernate 经验谈(一)
- JavaScript之DOM笔记
- 要么滚回去,要么拼命
- jquery模拟导航栏效果
- poj-2262 Goldbach's Conjecture
- String常量和String对象
- putty连接Linux之ssh无法启动
- C++面试题:循环数列问题
- Daily & Monthly Report