zoukankan      html  css  js  c++  java
  • hibernate查询优化延迟加载优化

            相信大家在使用hibernate(我这里使用的是3.6,因为我偏爱spring,但是hibernate4.x系以后和spring很多重复的地方,而且,spring也认为,hibernate4.x是一个很完善的框架了,spring3.x以后废弃掉了很多hibernate的支持类,所以我就不升级hibernate了)的时候都有这样的困惑,就是在配置hibernate映射文件的时候,如果有一对多(或者多对多)属性的时候,hinernate提供了一个优化机制,lazy属性,但是问题在于,配置文件是一次性配置,假如我项目中有的地方需要延迟加载,有的地方不需要延迟加载,这样的话就必须强制lazy=false,这样的话 这个优化机制就失去了他的意义.

            经过一段时间的经验积累,终于相处了一套可行性比较强的方案:

            项目中所有的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需要初始化的字段

            这样的话在项目中,那些需要加载关联对象数据的时候只需要使用这两个方法就可以了,而且是可以指定属性的,不用全部加载,在性能上有了很大的提高.

            这里只是一个代码片段,相信大部分程序员都能看懂,至于看不懂的伸手党程序员就自己琢磨吧




  • 相关阅读:
    小白详细解析C#反射特性实例
    几种快速排序算法实现
    Redis中算法之——Raft算法
    redis中算法之——MurmurHash2算法
    关于typedef的用法
    gdb调试工具常用命令
    gcc 常用命令
    Linux 远程登录ssh服务器
    Linux 构建ftp服务器
    知乎话题结构以及相关内容抓取二(Redis存储)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3006067.html
Copyright © 2011-2022 走看看