首页 > 代码库 > 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一级缓存