hibernate查询优化----延迟加载优化
2013-04-07 16:05
357 查看
相信大家在使用hibernate(我这里使用的是3.6,因为我偏爱spring,但是hibernate4.x系以后和spring很多重复的地方,而且,spring也认为,hibernate4.x是一个很完善的框架了,spring3.x以后废弃掉了很多hibernate的支持类,所以我就不升级hibernate了)的时候都有这样的困惑,就是在配置hibernate映射文件的时候,如果有一对多(或者多对多)属性的时候,hinernate提供了一个优化机制,lazy属性,但是问题在于,配置文件是一次性配置,假如我项目中有的地方需要延迟加载,有的地方不需要延迟加载,这样的话就必须强制lazy=false,这样的话
这个优化机制就失去了他的意义.
经过一段时间的经验积累,终于相处了一套可行性比较强的方案:
项目中所有的lazy属性默认为true,不再设置为false.在项目中添加了一个commonService,提供了两个方法,一个是查询单个对象,一个是查询列表:
Objclass 需要查询的对象的classidClass id字段的类型id id的值fields 需要初始化的字段
fields需要初始化的字段
这样的话在项目中,那些需要加载关联对象数据的时候只需要使用这两个方法就可以了,而且是可以指定属性的,不用全部加载,在性能上有了很大的提高.
这里只是一个代码片段,相信大部分程序员都能看懂,至于看不懂的伸手党程序员就自己琢磨吧
这个优化机制就失去了他的意义.
经过一段时间的经验积累,终于相处了一套可行性比较强的方案:
项目中所有的lazy属性默认为true,不再设置为false.在项目中添加了一个commonService,提供了两个方法,一个是查询单个对象,一个是查询列表:
@Override public Object findById(Class<?> Objclass, Class<?> idClass,Object id,String[] fields) { Object o = dao.findById(Objclass, (Serializable) idClass.cast(id)); if(fields!=null){ for(String field:fields){ String targetMethod = "get"+upperFirstWord(field); Method[] methods = Objclass.getDeclaredMethods(); for (Method m : methods) { if(m.getName().equals(targetMethod)){ try { Hibernate.initialize(m.invoke(o)); break; } catch (Exception e) { e.printStackTrace(); } } } } } return o; }
Objclass 需要查询的对象的classidClass id字段的类型id id的值fields 需要初始化的字段
public List<?> find(Class<?> entityClazz, QueryParameterSetter paraSetter, Sorter sorter, Page page,String[] fields) { DetachedCriteria dc = DetachedCriteria.forClass(entityClazz); if (paraSetter != null) paraSetter.setParameters(dc); if (sorter != null && sorter.getOrder() != null) dc.addOrder(sorter.getOrder()); List<?> l = findPageListByCriteria(dc, page.getPageSize(), page.getRecordStartIndex()); lazyInitialize(entityClazz,l,fields); return l; } private void lazyInitialize(Class<?> entityClazz,List<?> l ,String[] fields){ if(fields!=null){ for(String field:fields){ String targetMethod = "get"+upperFirstWord(field); Method[] methods = entityClazz.getDeclaredMethods(); for (Method m : methods) { if(m.getName().equals(targetMethod)){ try { for(Object o:l){ Hibernate.initialize(m.invoke(o)); } } catch (Exception e) { e.printStackTrace(); } } } } } }entityClazz 实体类型paraSetter 参数设置接口sorter 排序规则page 分页对象
fields需要初始化的字段
这样的话在项目中,那些需要加载关联对象数据的时候只需要使用这两个方法就可以了,而且是可以指定属性的,不用全部加载,在性能上有了很大的提高.
这里只是一个代码片段,相信大部分程序员都能看懂,至于看不懂的伸手党程序员就自己琢磨吧
相关文章推荐
- hibernate查询优化----延迟加载优化
- hibernate检索小结之——查询优化和延迟加载
- 【Hibernate】Hibernate性能优化之延迟加载与抓取策略
- (十四)Hibernate之性能优化之延迟加载机制
- 【Hibernate】性能优化之延迟加载机制
- Hibernate性能优化 --- 延迟加载(懒加载)
- Hibernate性能优化之————延迟加载与抓取策略
- 【Hibernate】性能优化之延迟加载机制
- Hibernate性能优化 --- 延迟加载(懒加载)
- 关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
- hibernate面试题 --- 在数据库中条件查询很慢的时候,如何优化
- Hibernate——(6)延迟加载机制
- json解决hibernate中级联对象延迟加载问题net.sf.json.JSONException: org....
- Hibernate之lazy延迟加载
- Hibernate和Spring的延迟加载和DAO模式
- 优化网站设计(十七):延迟或按需加载内容
- Hibernate 延迟加载充分体现了代理模式的优势
- VLC初始加载优化:avformat_find_stream_info接口延迟降低
- HIbernate延迟加载(转)
- spring+hibernate避免延迟加载异常