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 Setorders = new HashSet (); 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属性