Hibernate一级缓存

本文介绍了Hibernate中三种主要的查询方式及其与缓存的关系,包括HQL、SQL及Criteria查询的特点。此外还探讨了一级缓存的工作机制,如evict、clear、refresh等操作,以及如何处理缓存中的数据与数据库不同步的问题。最后详细解析了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();

      映射文件:

 

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

        

      一对一:人和身份证

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

 

5.hibernate 中的inverse(相反的)属性

    问题描述:维护一方的对象时,会自动维护另一方的关系。(两个都要维护)

      例如:删除用户时:会先移除Customer中引用的外键,然后在删除Customer

           保存对象:插入数据,更新外键。维护外键

    解决方案:

      单纯指定关系由一方来维护,另一方不维护关系。含有外键的进行维护(1的一方放弃,多的一方有外键)

      Customer的映射文件,orders的inverse 属性:true 

        保存对象:外键由order维护,customer的外键不需要进行维护(含有外键的order)

        删除对象:删除customer会导致,order引用了无效的id,违反了外键约束,由order来解除外键的约束

 

    inverse的使用场景:如果1的一方经常需要维护外键,在1的一方不需要配置inverse属性

 

 

    

 

  

  

转载于:https://www.cnblogs.com/glblog/p/6111754.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值