hibernate笔记

一、如何解决性能问题?

 发出的sql语句越少,性能越高
   方法:
      1、懒加载
      2、抓取策略
      3、缓存策略
      4、HQL语句

二、懒加载(lazy)
   1、类的懒加载
        1、利用session.load方法可以产生代理对象
        2、在session.load方法执行的时候并不发出sql语句
        3、在得到其一般属性的时候发出sql语句
        4、只针对一般属性有效,针对标示符属性是无效的
        5、默认情况就是懒加载
   2、集合的懒加载
        false  当session.get时,集合就被加载出来了
        true   在遍历集合的时候才加载
        extra
             针对集合做count,min,max,sum等操作
   3、单端关联的懒加载(多对一)
        <many-to-one lazy="false/no-proxy/proxy">  no-porxy 默认值  true
        根据多的一端加载一的一端,就一个数据,所以无所谓
总结:懒加载主要解决一个问题,类、集合、many-to-many在时候发出语句,加载数据

三、抓取策略:
   1、研究的主要是set集合如何提取数据
   2、在Classes.hbm.xml文件中
       <set fetch="join/select/subselect">
            join        左外连接
               如果把需求分析翻译sql语句,存在子查询,这个时候用该策略不起作用
            select      默认
               先查询一的一端,再查询多的一端
            subselect   子查询
 如果需要分析翻译成sql语句存在子查询,这个时候用该策略效率最高。

四、session.getCurrentSession的用法
  1、在hibernate的配置文件中:
        <property name="current_session_context_class">thread</property>
  2、不需要写session.close方法,在事务提交的时候会自动关闭(由hibernate内部完成)
  3、crud都需要事务
      1、因为是一个线程,所以整个方法中一个session,一个事务
      2、保证了整个业务操作的安全性

五、session缓存(一级缓存):
   1、生命周期就是session的生命周期
   2、一级缓存存放的数据都是私有数据
        把session存放在threadlocal中,不同的线程是不能访问的,所以保证了数据的安全性
   3、怎么样把数据存放到一级缓存中
        利用session.save/update/load/get方法都可以存放在一级缓存中
   4、利用session.get/load方法可以把数据从一级缓存中取出
   5、session.evict方法可以把一个对象从一级缓存中清空
   6、利用session.clear方法可以把session中的所有的数据清空
   7、利用session.Refresh方法把数据库中的数据同步到缓存中
   8、session.flush
        在session的缓存内部,会去检查所有的持久化对象
           1、如果一个持久化对象没有ID值,则会发出insert语句
           2、如果一个持久化对象有ID值,则会去检查快照进行对比,如果一样,则什么都不做,如果不一样,则发出update语句
           3、检查所有的持久化对象是否有关联对象
                检查关联对象的级联操作
                检查关联对象的关系操作

六、二级缓存:存放公有数据
   1、适用场合:
        1、数据不能频繁更新
        2、数据能公开,私密性不是很强
   2、hibernate本身并没有提供二级缓存的解决方案
   3、二级缓存的实现是依赖于第三方供应商完成的
         ehcache
         oscache
         jbosscache
         swamchache
   4、二级缓存的操作
         1、二级缓存存在sessionFactory中
         2、生命周期:与sessionFactory保持一致
         3、使用二级缓存的步骤
             1、在hibernate.cfg.xml
                  <property name="cache.use_second_level_cache">true</property>
                  <property name="cache.provider_class">
                        org.hibernate.cache.EhCacheProvider
                  </property>
             2、让某一个对象进入到二级缓存中
                 * 在配置文件中
                   <class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>
                 *  在映射文件中
                    <cache usage="read-only"/>
             3、使用
                  session.get/session.load

七、hibernate的查询方式
   1、hql(hibernate query language)  query
   2、Criteria query
   3、Native query
总结:
   1、如果页面上要显示的数据和数据库中的数据相差甚远,利用带select的构造器进行查询是比较好的方案
   2、如果页面上要显示的数据和数据库中的数据相差不是甚远,这个时候用迫切连接
   3、如果采用迫切连接,from后面跟的那个对象就是结构主体
   4、如果多张表进行查询,找核心表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值