1 get方法和load方法查询时的区别:
如果在缓存中没有找到相应的对象,get会直接访问数据库并返回一个完全初始化的对象,过程中可能涉及多次数据库调用;而load会返回一个代理对象,只有在对象getId()之外的方法被调用时才会真正的去访问数据库,在某些情况下大幅度提高了性能
如果数据库中没有数据,get返回null;load调用某个属性时发生异常(org.hibernate.ObjectNotFoundException)
get不支持延迟加载;load支持延迟加载
2 openSession和getCurrentSession的区别:
openSession是new一个新的session并返回;getCurrentSession会先查看当前线程(ThreadLocal)中是否绑定了session,如果有直接返回,没有就先创建再返回
getCurrentSession使用ThreadLocal实现线程session的隔离
openSeession在事务提交时需要手动关闭session,getCurrentSession是自动关闭
3 Hibernate的缓存有哪些?缓存的作用分为几类?
Hibernate缓存分为一级缓存、二级缓存和查询缓存
一级缓存又称session缓存,由于session对象的生命周期通常对应一个数据库事务,因此一级缓存是事务范围内的缓存;一级缓存是不可关闭的,在一级缓存中,持久化类的每个实例都有一个唯一的OID
二级缓存是sessionFactory缓存,又分为内置缓存和外置缓存。内置缓存时Hibernate自带的,不可关闭,是只读缓存,用来存放元数据和预定义SQL语句;外置缓存是一个可配置的缓存插件,默认sessionFactory没有启用,外置缓存中存放数据库数据的复制。sessionFactory对象的生命周期和应用程序的整个进程相对应。二级缓存是可选的,可以在每个类或每个集合的粒度上配置二级缓存
查询缓存,是Hibernate为查询结果提供的,依赖于二级缓存
4 Hibernate缓存的作用分为几类?
事务范围:每个事务都有自己的缓存,缓存内的数据不会被多个事务并发访问;例如一级缓存,session内的数据只能被当前事务访问,不可跨session
进程范围:进程内的事务共享缓存,进程结束,缓存结束;例如二级缓存,可跨session访问
集群范围:缓存被一个或多个机器上的多个进程共享;二级缓存也可以作为集群范围的缓存
5 Hibernate的检索方式有哪些?
HQL检索
QBC检索
本地SQL检索
6 Hibernate的查询方式有哪些?
7 Hibernate中session的清理和清空的区别:
清理缓存调用session.flush();清空缓存调用session.clear()
session清理缓存是按照缓存中对象的状态的变化来同步更新数据库,但不清空缓存;清空是把session的缓存置空,但不同步更新数据库
8 如何调用原生SQL?
Hibernate4中官方推荐使用session.doWork(Interface)进行jdbc操作
9 Hibernate中如何实现类之间的关系?
类与类的关系主要体现在表与表之间的操作,他们都是对对象进行操作,程序中将所有的表和类映射在一起,通过one-to-one、one-to-many、many-to-one、many-to-many进行声明
10 Hibernate中如何进行性能优化?
对象的三种状态
一级缓存和快照
延迟加载策略
抓取策略
整合c3p0连接池
二级缓存