1. 1.今日任务
    1. 1.延迟加载
      1. 概念
        1. 懒加载,当数据真正需要使用的时候才会去数据库中获取数据
        2. 如果没有使用的时候返回的是一个代理对象
        3. 为了避免一些无谓的性能开销而提出来的
      2. 作用范围
        1. 只能在同一个session中
        2. 显示加载
          1. Hibernate.initialize(e);
      3. 种类
        1. 1.对实体类的延迟加载
          1. load方法,懒加载
          2. lazy
          3. 控制是否开启延迟加载
        2. 2.对集合属性的延迟加载
          1. 1对多的关系中,
          2. 案例:部门和员工
          3. lazy
        3. 3.对属性的延迟加载
          1. 字段中的内容很多,没有使用的时候没有必要查询出来,比如 clob blob类型
          2. 需要添加一个增强器
          3. 不推荐使用
          4. 替代方案,分两次查询,写HQL语句
    2. 2.抓取策略
      1. 概念
        1. 当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略
        2. 1个对象抓取另一个对象方法
      2. fetch
        1. join 连接抓取
          1. 左链接的方式
          2. 延迟加载无效
        2. select
          1. 普通查询,延迟加载有效
          2. 默认情况
      3. 设置打印sql语句格式化
      4. 1对1
        1. 默认是 join
        2. 只有 join 和 select
      5. 1对多
        1. join
        2. select
          1. 默认情况下
          2. 查询多行部门数据,同时打印每个部门对应的人数
        3. subselect
          1. 只能出现在set节点中
          2. 查询多行部门数据,同时打印每个部门对应的人数
        4. n+1问题
          1. 查询多行部门数据,同时打印每个部门对应的人数
          2. 批量抓取
          3. batch-size="2" fetch="select"
          4. 批量每次几个 全局的设置
          5. subselect
    3. 3.缓存管理
      1. 参考资料
        1. http://blog.csdn.net/qjyong/article/details/1814377
        2. http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html
      2. 一级缓存
        1. 实现原理
          1. 内存中有一个Map对象保存Session中查询的数据
          2. 作用范围就一个Session生命周期
          3. session关闭后Map中的数据会被清空
          4. hibernate自动管理,不需要我们人为干扰
        2. 会放入缓存的情况
          1. 1.查询的对象
          2. 2.添加和修改的对象
          3. session.clear()会情况缓存中的数据
          4. 3.集合数据
      3. 二级缓存
        1. 第三方常用组件
          1. ehcache
          2. redis
        2. ehcache使用
          1. 1.导入相关jar包
          2. 2.放开二级缓存
          3. 3.配置二级缓存的实现类
          4. 提示没有手动添加
          5. 默认配置文件
          6. 可以自定义配置
          7. 4.在需要使用二级缓存的配置文件处加配置
          8. 5.查询二级缓存使用实现
        3. 二级缓存使用
          1. 1.查询的对象
          2. 2.添加和修改的对象
          3. 3.集合数据
          4. 4.统计功能
          5. 添加的代码
          6. SessionFactory factory = null; @Before public void setUp() throws Exception { factory = HibernateSessionFactory.getSessionFactory(); } @After public void tearDown() throws Exception { Statistics s = factory.getStatistics(); System.out.println("miss:" + s.getSecondLevelCacheMissCount()); System.out.println("put:" + s.getSecondLevelCachePutCount()); System.out.println("hit:" + s.getSecondLevelCacheHitCount()); }
        4. 重点
          1. 向二级缓存中保存数据
          2. save,update,saveorupdate,list,iterator,get,load
          3. 从二级缓存中取数据
          4. 但只有(没打开查询缓存时)session的iterator,get,load会 从二级缓存中取数据
          5. 案例
          6. 单独的list是不会从缓存中取数据的
          7. 开启查询缓存list方法才会有效果
          8. 1.开启查询缓存
          9. 2.添加设置
          10. 查询缓存命中率低
          11. Map保存的 key是用我们的查询条件来保存的
        5. 缓存总结
          1. 二级缓存策略的一般过程如下
          2. 1) 条件查询的时候,总是发出一条select * from table_name where * ….(选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
          3. 2) 把获得的所有数据对象根据ID放入到第二级缓存中。
          4. 3)当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
          5. 查询缓存
          6. 1) Hibernate首先根据这些信息组成一个Query Key,QueryKey包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等
          7. Hibernate根据这个QueryKey到Query缓存中查找对应的结果列表 。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。 3) QueryKey中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。 只有当经常使用同样的参数进行查询时,这才会有些用处 在使用查询缓存的时候,必须设置query.setCacheable(true) ;
        6. ehcache配置详解
          1. http://www.cnblogs.com/sunxucool/p/3159076.html
      4. 取数据的规则
        1. 先从一级缓存中取数据, 如果一级缓存中不存在再去二级缓存中查找【前提开启了二级缓存】
        2. 缓存没有数据的话会去数据库中查询,查询的结果会放入一级和二级缓存中
    4. 4.spring和hibernate整合
      1. 1.集成spring环境
      2. 2.集成hibernate环境
        1. 1.注意配置
          1. 子主题 1
          2. 子主题 2
      3. 3.在spring配置文件中配置
        1. 1.配置aop事务
          1. <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 事务的传播属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <!-- aop配置 --> <aop:config> <aop:pointcut expression="execution(* com.hd.service.impl.*.*(..))" id="txPointcut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> </aop:config>
        2. 2.配置数据源并引用
          1. 子主题 1
      4. 4.扫描
      5. 5.反向生成model和配置文件
      6. 6.dao
        1. 获取sessionFactory对象
        2. session获取--> getCurrentSession获取
      7. 7。service
      8. 8.测试
        1. 可能出现的问题
          1. 1.c3p0不兼容
          2. 方言不配置
          3. 事务传播属性配置
  2. 2.作业
  3. 3.面试题