面试-框架-hibernate

来源:互联网 发布:删除sql字段数据 编辑:程序博客网 时间:2024/06/06 01:48

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"> <![CDATA[from Emp where     * empno=?]]> </query>     *      *      * <sql-query name="findEmpByIdSqlQuery"> <return alias="e"     * class="entity.Emp"/>      * <![CDATA[select {e.*} from emp e where empno=?]]>     * </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”方来进行关联关系的维护    <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>    <!-- 设置二级缓存插件EHCache的Provider类-->    <property name="hibernate.cache.provider_class">        org.hibernate.cache.EhCacheProvider    </property>
hibernate 4<property name="hibernate.cache.use_second_level_cache">        true    </property>    <!-- 设置二级缓存插件EHCache的Provider类-->        <property name="hibernate.cache.region.factory_class">        org.hibernate.cache.ehcache.EhCacheRegionFactory    </property>

查询缓存:
为Query的list准备,iterator没有效果。

// 查询缓存    /*     * <property name="hibernate.cache.use_query_cache">true</property>     * <property name="hibernate.cache.use_second_level_cache">true</property>     * <!-- 设置二级缓存插件EHCache的Provider类-->     *  <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();    }
原创粉丝点击