面试-框架-hibernate

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();
    }

你可能感兴趣的:(面试总结)