Hibernate框架学习笔记 lesson4

来源:互联网 发布:简洁视频网站源码 编辑:程序博客网 时间:2024/06/05 19:44

延迟加载(lazy)

根据主键查询 :

Emp emp = (Emp)session.get(Emp.class,1001); 立即加载,返回真实对象

Emp emp= (Emp)session.load(Emp.claa,1001);  延迟查询,并没用发送sql查询,在调用emp的get方法时查                                                                                          询 ,返回代理子类对象,这样在需要的时候查询从而提升性                                                                                           能


<class name="entity.Emp" table="emp" lazy="true"> lazy属性 默认为true


  load():  默认是延迟加载 

            返回的是代理对象  用了代理模式(会生成代理对象)

查询一个不存在的主键时,会报错

load实现原理:

Emp_javassist_0 extends Emp{

 getEname(){

 // 发送sql查询

 }

}


 get():      立即加载  (没有用代理模式,不会有代理对象)

返回的是真实对象

查询一个不存在主键时,不会错,输出null


list():  立即加载 

iterator():  延迟加载


Hibernate的对象状态 :

    临时状态(瞬时状态)  临时对象  Transient

   随时有可能被回收器  刚刚new出来的 ,不处于Session的缓存中

在表中没有与之对应的记录.

 Emp e = new Emp();



    持久状态:Persistent

 不能被回收的    表中有与之对应的记录   被session管理了(这个对象处于session缓存中)   

  session.save(e);

  session.get(Emp.class,1001);


    游离状态(托管状态):Detached

   不在处于session缓存区了(不被session管理了)

在表中一般有与之对应的记录      

可以被回收的  

 
   session.close();
   session.clear();//将session缓存中的数据全部清空了 


hibernate的缓存

    提升性能
    将一个对象查询出来后,放入到缓存中,
    下次再需要这个对象,就不需要在发送sql查询,直接在缓存中就查到.
1) 一级缓存: session级别缓存   默认就是开启的 

    session对象在  session缓存就存在
   session关闭了   session缓存释放了

Session session = HibernateUtils.getSession();

Emp emp = (Emp)session.get(Emp.class, 1002);//发送sql查询   放入到session一级缓存中   

System.out.println("------------------------");

Emp emp2 =(Emp)session.get(Emp.class,1002);//没有发送sql查询  而是直接从缓存中获取这个对象

System.out.println(emp==emp2);

HibernateUtils.closeSession();//session一级缓存就释放了 

System.out.println("**********************************");

Emp emp3 = (Emp)HibernateUtils.getSession().get(Emp.class, 1002);//因为上面已经将session关闭了  所以缓存没有了 只能发送sql查询

//session.clear();//将缓存中的所有数据全部清空 

session.evict(emp); //将指定的对象 从session一级缓存删除掉

evict(): 只清除指定的数据

clear():清空缓存中的所有数据



2)二级缓存   SessionFactory级别缓存 缓存范围更大 
        跨session缓存问题.

   默认是关闭的 

  a.启用二级缓存 并且指定具体的提供商

     <property name="cache.use_second_level_cache">true</property>

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 

  b.在src下创建ehcache.xml 

     配置二级缓存具体管理办法:

  <cache name="sampleCache1"

        maxElementsInMemory="10000" 最大存储量  

        eternal="false"   永久不删除

        timeToIdleSeconds="300"  不访问情况下的访问时间

        timeToLiveSeconds="600" 存活时间

        overflowToDisk="true" 是否支持往硬盘写

        />

   c.在需要的*.hbm.xml:指定

    <!-- 指定那个类需要二级缓存

           usage:只读/读写

           region:指定缓存的管理名字 空为默认

           -->

      <cache  region=""  usage="read-only"/>


Session session = HibernateUtils.getSession();

Emp emp = (Emp)session.get(Emp.class, 1003);//会放入到二级缓存中

HibernateUtils.closeSession();

Session session2= HibernateUtils.getSession();

Emp emp2 = (Emp)session2.get(Emp.class, 1003);//从二级缓存中获取数据

0 0
原创粉丝点击