最新研究ssh,编写了一些测试用例,现针对网上流传的一些观点总结如下,欢迎大家发表观点,将网上流传的一些错误纠正,以免误导一大群人:1. load方法可以返回实体的代理类,get方法则返回真是的实体类。 
   正确
   
2. load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
   实际上load()和get()方法都会使用二级缓存,如下例子:
        cls = (TblCls)session.load(TblCls.class,1);
        System.out.println("load()第一次 ---- "+cls.getSortName()); 
//清理一级缓存,测试第二次是否会利用二级缓存(hbm对应配置略)
cls = null;session.close(); try {Thread.sleep(5000);} catch (InterruptedException e) {}

session = template.getSessionFactory().openSession();
cls = (TblCls)session.get(TblCls.class,1); 
System.out.println("get()第一次 ---- "+cls.getSortName()); 
cls = null;session.close(); try {Thread.sleep(5000);} catch (InterruptedException e) {}

/**========================测试下面代码是否会在控制台打印sql================================*/
session = template.getSessionFactory().openSession();
cls = (TblCls)session.load(TblCls.class,1); 
System.out.println("load()第二次 ---- "+cls.getSortName()); 
cls = null;session.close(); try {Thread.sleep(5000);} catch (InterruptedException e) {}

session = template.getSessionFactory().openSession();
cls = (TblCls)session.get(TblCls.class,1); 
System.out.println("get()第二次 ---- "+cls.getSortName());   
cls = null;session.close(); try {Thread.sleep(5000);} catch (InterruptedException e) {}
session = template.getSessionFactory().openSession();
   测试结果,不管是load()还是get(),第一次加载对象发出sql, 第二次加载对象均不发出sql,说明都利用了二级缓存数据
   
3. load()支持延迟加载,get()不支持延迟加载
    所谓延迟加载就是在等到访问待加载对象时才从db加载该对象,在不使用load的对象的话就不会发送sql到数据库,而get()照发不误,这个通过验证是正确的,如下例子:
    cls = (TblCls)session.load(TblCls.class,sort); 
log.info("没用到了TblCls对象cls,不会发送任何sql");
session.clear();

cls = (TblCls)session.load(TblCls.class,sort); cls.getSortName()
log.info("用到了TblCls对象cls,会发送sql");
session.clear();

cls = (TblCls)session.get(TblCls.class,sort); 
log.info("没用到了TblCls对象cls,照样发送sql");
session.clear();

cls = (TblCls)session.get(TblCls.class,sort); cls.getSortName()
log.info("用到了TblCls对象cls,会发送sql");
session.clear();
根据例子可以看出,load()支持延迟加载,get()不支持延迟加载

解决方案 »

  1.   

    楼主能不能说说在什么情况下用hibernate好,在什么情况下用ibatis好?
      

  2.   

    在什么情况下用hibernate好,在什么情况下用ibatis好?
    这个没有绝对的定论,在于你目前团队对这两个orm框架的熟悉程度,再者,ibatis是一个半自动化orm工具,对sql没有hibernate封装的那么死板,实际上通过ibatis,你完全可以按标准的sql语句那样熟练书写sql,对于sql掌握很精通的用ibatis比较合适,可以自行调优sql,hibernate对底层sql做了优化处理,比如分页等,不需要你自己去关心内部如何优化,还有hibernate的二级缓存,延迟加载策略等,关键看你掌握的好不好,使用得当,会极大提高开发效率和程序性能,相反,开发出的程序将会是一场噩梦
      

  3.   

    Hibernate的速度好像只有JDBC的十分之一
      但是hibernate非常方便. 所以一般开发都是hibernate+JDBC