1、为什么要使用hibernate开发项目?
优势1:封装了jdbc访问数据库的操作,大大减少了重复代码
优势2:很大程度的简化了dao层代码
优势3:支持各种数据库,支持一对一 一对多 多对多的复杂关系
优势4:对表的查询转换成对象的查询,多表联合查询非常方便
2、hibernate开发流程
Configuration conf=new Configuration().configure();// 读取配置文件 hibernate.cfg.xml
SessionFactory sessionFactory=conf.buildSessionFactory();// 通过配置信息 建立会话工厂
Session session=sessionFactory.openSession();// 会话工厂 开启session会话对象
Transaction ts=session.beginTransaction();//开启事务
//操作....
ts.commit();//提交事务
session.close();//关闭session
sessionFactory.close();//关闭session工厂
3、什么是延迟加载?
在真正需要数据的时候才进行数据的加载,避免一些没有必要的内存开销。
4、get和load的区别?
hibernate的get方法执行的时候,会确认一下该id的对象是否存在,先在session缓存中找,再在二级缓存中查找,如果没有则去数据库查找,如果没有,则返回null
hibernate的load方法执行时,判断lazy属性,如果是false,查找顺序与get一致,只是没有查到的时候,抛出异常ObjectNotFound,如果是true,则首先在session缓存中查找,如果不存在,则延迟加载,返回该对象的代理对象。等到具体使用的时候,再先从二级缓存中查找,再数据库查找,如果找不到,抛出异常ObjectNotFound
5、hibernate查询方式?
原生sql
session.createSQLQuery()
,Hql
session.createQuery()
命名查询
放在class>后面 <query name="findEmpById"> query>
*
*
* <sql-query name="findEmpByIdSqlQuery"> <return alias="e" * class="entity.Emp"/>
*
* sql-query>
session.getNamedQuery(name)
Criteria 复杂查询
6、hibernate分页查询
query.setFirstResult(start);起始行
query.setMaxResults(size);条数
criteria.setFirstResult(start);起始行
criteria.setFetchSize(size);条数
7、hibernate中对象的三种状态
瞬时态:
不在session缓存中,不与任何session相关联
不存在数据库记录中
持久态:
在session缓存中,与session相关联
存在数据库记录中
游离态:
不在session缓存中,不与任何session实例相关联
存在数据库记录中
8、inverse和cascade
<one-to-many>中,建议one 方inverse=”true”,由“many”方来进行关联关系的维护
to-many>中,在任意一方设置inverse=true,另一方inverse=false。
Cascade,通常情况下都不会使用。特别是删除,一定要慎重
9、hibernate缓存
一级缓存session级别:同一个session,无需设置
二级缓存所有session:所有session,需要设置,保存在sessionFactory中
hibernate 3
<property name="hibernate.cache.use_second_level_cache">
true
property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
property>
hibernate 4
<property name="hibernate.cache.use_second_level_cache">
true
property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
property>
查询缓存:
为Query的list准备,iterator没有效果。
// 查询缓存
/*
* <property name="hibernate.cache.use_query_cache">trueproperty>
* <property name="hibernate.cache.use_second_level_cache">trueproperty>
*
* <property name="hibernate.cache.provider_class">
* org.hibernate.cache.EhCacheProvider property>
*/
public static void chaxunhuancun() {
Session session = getSessionFromUtil();
Query query = session.createQuery("from Emp where empno=7369");
query.setCacheable(true);// 开启查询缓存
query.list();
Session session2 = getSessionFromUtil();
Query query2 = session2.createQuery("from Emp where empno=7369");
query2.setCacheable(true);
query2.list();
}