Session操作,查询过滤,缓存利用,批量处理数据查询,装载1.Session---单数据加载---load/getLoad方法根据指定的实体类和id从数据库装载认为存在的一条记录.应该确保对象确实存在,否则会抛出ObjectNotFoundException.Load方法可返回实体的代理类实例,可充分利用内部缓存和二级缓存中的现有数据.get方法根据指定的实体类和id从数据库查询并装载一条记录.数据不存在将得到null.get方法返回的永远是实体类.只在内部缓存中进行数据查找,如果没有数据就调用SQL完成数据读取.出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件。如果Session中一个无效的查询条件重复出现,即可迅速做出判断。对于load方法而言,如果内部缓存中没有发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。如果在缓存中未发现有效数据,则发起数据库查询操作(SelectSQL).如果经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。否则根据映射配置和SelectSQL得到的ResultSet,创建对应的数据对象.并将其数据对象纳入当前Session实体管理容器(一级缓存)。执行Interceptor.onLoad方法(如果有对应的Intercepeor)。将数据对象纳入二级缓存。如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。返回数据对象。2.Session---批量数据查询---find/iterate|createQuery().list/iterateHibernate2的find/iterate分别返回list和Iterator,Hibernate3中,上述方法已经从Session接口中废除,统一由Query接口提供。Hibernate3将Session的createQuery()方法得到的Query对象调用list/iterate方法实现相同的功能.从实现体制而言,这两个版本之间并没有什么差异。find/list方法通过一条selectsql实现查询;而iterate则执行1+N次查询,它首先执行selectsql获取满足条件的id,再根据每个id获取对应的记录.find方法将执行SelectHQL从数据库中获得所有符合条件的记录并构造相应的实体对象,实体对象构建完毕之后,就将其纳入缓存。为之后的iterate方法提供了现成的可用数据。这样,之后iterate方法执行时,它首先执行一条SelectSQL以获得所有符合查询条件的数据id,随即,iterate方法首先再本地缓存中根据id查找对应的实体对象是否存在(类似Session.load方法),如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果,如果没找到,再执行相应的Select语句获得对应的库表记录(iterate方法如果执行了数据库读取操作并构建了完整的数据对象,也会将其查询结果纳入缓存)。根据java面向对象的继承层次,Object是所有类的父类,所以使用面对对象的持久化框架Hibernate可以执行下述操作:publicstaticvoidtestHibernateOO(){Sessions=HibernateSession3.getSession();IteratorObjectitor=(IteratorObject)s.createQuery(FROMjava.lang.Object).list();while(itor.hasNext()){ObjectrowData=itor.next();System.out.println(rowData.getClass()+:);}}3.Session批量数据查询与缓存利用的示例如果执行下面的代码:Tuserdata=null;IteratorTuserdataItor=hibernate_session.createQuery(FromTuser).iterate();while(dataItor.hasNext()){data=dataItor.next();System.out.println(iterate:+data.getName()+:+data.getEmail());}Hibernate:selecttuser0_.idascol_0_0_fromT_usertuser0_Hibernate:selecttuser0_.idasid2_0_,tuser0_.nameasname2_0_,tuser0_.emailasemail2_0_fromT_usertuser0_wheretuser0_.id=?iterate:AiSee11652:[1w@11,1w@11,as@tsts.com]Hibernate:selecttuser0_.idasid2_0_,tuser0_.nameasname2_0_,tuser0_.emailasemail2_0_fromT_usertuser0_wheretuser0_.id=?iterate:Washing:[aisee@163.com]如果执行下面的代码:Tuserdata=null;ListTuserdatas=hibernate_session.createQuery(FromTuser).list();for(inti=0;idatas.size();i++){data=datas.get(i);System.out.println(list:+data.getName()+:+data.getEmail());}System.out.println(\r\nUseiterate);IteratorTuserdataItor=hibernate_session.createQuery(FromTuser).iterate();while(dataItor.hasNext()){data=dataItor.next();System.out.println(iterate:+data.getName()+:+data.getEmail());}Hibernate:selecttuser0_.idasid2_,tuser0_.nameasname2_,tuser0_.emailasemail2_fromT_usertuser0_list:AiSee11652:[1w@11,1w@11,as@tsts.com]list:Washing:[aisee@163.com]UseiterateHibernate:selecttuser0_.idascol_0_0_fromT_usertuser0_iterate:AiSee11652:[1w@11,1w@11,as@tsts.com]iterate:Washing:[aisee@163.com]如果执行下面的代码:Tuserdata=null;ListTuserdatas=hibernate_session.createQuery(FromTuser).list();for(inti=0;idatas.size();i++){data=datas.get(i);System.out.println(list:+data.getName()+:+data.getEmail());}System.out.println(\r\nUseiterate);IteratorTuserdataItor=hibernate_session.createQuery(FromTuser).iterate();while(dataItor.hasNext()){data=dataItor.next();System.out.println(iterate:+data.getName()+:+data.getEmail());}System.out.println(\r\nUselistAGAIN);datas=hibernate_session.createQuery(FromTuser).list();for(inti=0;idatas.size();i++){data=datas.get(i);System.out.println(list:+data.getName()+:+data.getEmail());}Hibernate:selecttuser0_.idasid2_,tuser0_.nameasname2_,tuser0_.emailasemail2_fromT_usertuser0_list:AiSee11652:[1w@11,1w@11,as@tsts.com]list:Washing:[aisee@163.com]UseiterateHibernate:selecttuser0_.idascol_0_0_fromT_usertuser0_iterate:AiSee11652:[1w@11,1w@11,as@tsts.com]iterate:Washing:[aisee@163.com]UselistAGAINHibernate:selecttuser0_.idasid2_,tuser0_.nameasname2_,tuser0_.emailasemail2_fromT_usertuser0_list:AiSee11652:[1w@11,1w@11,as@tsts.com]list:Washing:[aisee@163.com]UselistHibernate:selecttuser0_.idasid2_,tuser0_.nameasname2_,tuser0_.emailasemail2_fromT_usertuser0_list:AiSee11652:[1w@11,1w@11,as@tsts.com]list:Washing:[aisee@163.com]如果执行:Tuserdata=null;System.out.println(\r\nUselist);ListTuserdatas=hibernate_session.createQuery(FromTuser).list();for(inti=0;idatas.size();i++){data=datas.get(i);System.out.println(list:+data.getName()+:+data.getEmail());}hibernate_session.close();hibernate_session=MySessionFactory.getSession();System.out.println(\r\nUseiterate);IteratorTuserdataItor=hibernate_session.createQuery(FromTuser).iterate();while(dataItor.hasNext()){data=dataItor.next();System.out.println(iterate:+data.getName()+:+data.getEmail());}System.out.println(\r\nUselistAGAIN);datas=hibernate_session.createQuery(FromTuser).list();for(inti=0;idatas.size();i++){data=datas.get(i);System.out.pr