首页 > 代码库 > Hibernate一级缓存

Hibernate一级缓存

1.三种查询方式:

     1.1.HQL语句:批量查询时,查询结果会进入缓存中。(先查询list,再查询单条记录,只打印一条语句),HQL不会使用一级缓存。(重复的查询,结果只打印一条SQL)

  1.2.SQL查询:如果把查询结果封装到对象中,对象会放入到一级缓存中,如果没有将查询结果放到对象中,不会放到一级缓存中

  1.3.criteria查询:会将查询结果放入到一级缓冲中,但是查询不会使用一级缓存(与HQL查询的结论相似)

2.缓存中的数据与数据库中的不同步,会优先使用缓存中的。

     使用JDBC,在一级缓存中出现该问题的几率比较小。

     一级缓存的生命周期:opeansession,一级缓存生命周期开始,session.close();一级缓存销毁

3.其他的API(了解

  3.1evict将缓存中的对象删除

      3.2clear清空1级缓存

   3.3refresh 刷新,强制刷新缓冲的对象(可以解决缓存不同步的问题),调用方法时会发送一个sql语句给数据库

   3.4flush对比快照,并提交缓存对象。

    User u1=(User)session.get(User.class,1l);
    u1.setName("zhangsan");
    session.flush();  //同步,执行update语句

  3.5自然主键=>assigned

    update 与saveorUpdate 方法

          saveorUpdate,可以同时完成保存或者更新操作

     主键为空=》报错,无id

       主键有值=》存在update,不存在insert方法

  3.6错误  

  User  u=(User)session.get(User.class,1);  //持久化状态
  session.evict(u);                                     //游离状态,缓冲中不存在
  User u2=(User)session.get(User.class,1);  //持久化状态,缓存中存在
  session.update(u);                                    //持久化状态,缓存中存在

  //结果会报错;因为内存当中不存在两个相同的id对应值的对象放入到一级缓存.        

4.Hibernate中的关系

        一对多:customer 和订单(多的一方外键)   

    Customer类:private Set<Order> orders = new HashSet<Order>();
     Order    类: private Customer customer = new Customer();

      映射文件:

 

    多对多 :老师和学生(建立中间表)

        

      一对一:人和身份证

      (主键同步(即是主键又是外键),任意一方添加主键

  

 

  

  

Hibernate一级缓存