hibernate面试资料总结
hibernate面试资料总结 为什么使用hibernate 1、对JDBC操作提供封装,方便操作简化数据库访问的代码(connection,eparedStatement,resultSet); 2、简化DAO层的代码量ORM从关系型DB到面向对象(java)的转变 3、在java代码中充斥着大量的sql语句不便于维护,但是ORM映射可以减少此类代码,便于维护 session.load和session.get的区别 两者都是用缓存,load查询数据如果没有会出现Exception ,get会出现null load支持lazy , get不支持lazy load 查询 先查一级缓存,如果没有数据则会生成ciglib,在实际使用的时候(也就是lazy=true)查询二级缓存,还没有数据查询数据库,在没有就会出现异常,主意这里是Exception get 先查询一级缓存,在查询二级缓存最后查询数据库如果没有数据则出现null hibernate中lazy的有效期是在session打开状态下 <class>上的lazy特性会影响普通属性 一级缓存是session级别的二级缓存是sessionFactory级别的 session使用evict和clear来管理缓存,不同的session不能共享数据但是可以共享sessionFactory session和sessionFactory中存储的形式类似于Map 的键值对 key为实体对象的ID value 为实体对象 get load iterator 使用一级缓存 save方法支持缓存 list和iterate的区别? * list每次都会发出查询语句,list向缓存中放入数据,但不利用缓存中的数据 * iterate在默认情况下利用缓存中的数据,只有在缓存中根据id无法找到相应 list不使用一级缓存 只会向 缓存中插入数据 所以list 每次都会发出sql语句 iterator N+1 问题 iterator查询实体对象会发出查询 ID 列表的sql语句如果一级二级缓存有数据则不发出查询实体的sql语句,如果没有则直接查询DB list N+1 问题 实用查询缓存 查询实体对象 二级缓存不存在或是过期或者是evict 关于查询缓存: hibernate查询缓存 查询缓存是针对普通属性结果集的缓存 对实体对象的结果集会缓存id 查询缓存的生命周期,当关联的表发生修改,那么查询缓存的生命周期结束 查询缓存的配置和使用: * 启用查询缓存,修改hibernate.cfg.xml文件 <property name="hibernate.cache.use_query_cache">true</property> * 在程序中必须启用,如: query.setCacheable(true); ---------------------------------------------- * 开启查询缓存,关闭二级缓存 开启一个session,分别调用两次query.list()查询普通属性 每次调用list 都要设置 query.setCacheable(true); 只发出一条sql语句; * 开启查询缓存,关闭二级缓存 开启两个session,分别调用query.list()查询普通属性 第二次query.list()不会发出查询sql,因为查询缓存的生命周期和session无关 * 开启查询缓存,关闭二级缓存 开启两个session,分别调用query.iterate()查询普通属性 查询缓存只对query.list起作用,query.iterate不起作用,其实query.iterate不使用查询缓存 * 关闭查询缓存,关闭二级缓存 开启两个session,分别调用query.list()查询实体对象 发出查询sql,因为query.list默认情况下,每次都会发出查询sql * 打开查询缓存,关闭二级缓存 开启两个session,分别调用query.list()查询实体对象 会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,而且是跨session查询 查询缓存会缓存实体对象的id,所以hibernate会根据实体对象的id加载相应的实体 如果缓存中存在则加载缓存中的数据,否则根据id发出相应的查询语句 * 打开查询缓存,开启二级缓存 开启两个session,分别调用query.list()查询实体对象 不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表 hibernate会根据实体对象的id到二级缓存中取得相应的数据 Transient状态的对象的特性? * 在数据库中没有与之匹配的记录 * 没有纳入session的管理 persistent状态的对象的特性? * 纳入session的管理 * persistent状态的对象在数据库中存在与之匹配的数据 * persistent状态的对象在清理缓存(脏数据检查),会和数据库同步 detached状态的对象的特性? * 在数据库中存在与之对应的记录 * 没有纳入session的管理 session.flush方法主要做两件事: * 清理缓存 * 执行sql session在什么情况下执行flush * 默认在事务提交时 * 显示调用flush * 在执行查询前,如:iterate
相关推荐
微微撒 2020-04-18
gwn00 2020-01-14
无情的你无情的雨 2020-07-18
dongxurr 2020-07-26
jimgreatly 2020-06-03
cnflat0 2020-04-25
技术驱动人生 2020-04-08
Justagreenonion 2020-03-27
zhiyuan0 2020-02-24
云之飞踢 2020-01-28
明月清风精进不止 2020-01-07
Justagreenonion 2020-01-05
manbucy 2014-05-20
javamagicsun 2019-12-17
栖梧桐 2019-12-13
javamagicsun 2019-12-04
GechangLiu 2016-11-23
flydoging 2019-11-05
Ashes 2019-11-05