Hibernate面试总结

Hibernate面试总结

1,谈谈你对hibernate的理解

(1)为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。java采用jdbc来实现这个功能,但是使用jdbc完成上述功能的话需要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,而且也会产生大量的冗余代码

(2)通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即Object Relation Mapping),人们可以通过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。

(3)使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。

(4)使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。

2,谈谈hibernate的生命周期

Hibernate面试总结

3,hibernate优点

(1) Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。使得开发人员将更多的精力放到业务逻辑的处理上.
(2) Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
(3) hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
(4) hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系

(5)hibernate解决jdbc数据移植难度比较大,不利于后期维护和二次开发的问题

(6) hibernate解决jdbc表数据关联复杂,sql语句编写难度比较大的问题,不用自己手写表的数据关联

4,hibernate与ibatis区别

hibernate:一站式持久化框架(相对jdbc节省90%的代码)

ibatis:半持久化框架(相对jdbc节省60%的代码),sql语句放在xml文件中,ibatis读取xml文件,获取sql语句,提供find方法,完成查询,要求数据库中的字段名要和实体类中的属性名相同,如果不相同,则加入as进行修饰即可(select t_id as id......)

5,hibernate的延迟加载(懒加载)机制是如何延迟加载的,以及延迟加载的优点?怎样禁止延迟加载?

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载(底层:在加载类的时候,会生成一个动态类,这个动态类继承被加载的类,类中的get方法中的第一句就是发送sql语句执行查询操作)

优点:hibernate延迟加载节省了服务器的内存开销,从而提高了服务器的性能

如何禁止: 把实体对象使用final修饰(但在实际开发中不建议使用final来修饰实体对象,因为在很多框架中大量使用懒加载机制)

在实体映射配置文件中的class标签中设置属性<class lazy="false">

6,使用懒加载机制时应注意

get方法没有使用延迟加载,而load方法使用了延迟加载.当使用load方法对对象进行加载之后如果关闭了session之后再去通过getXxx方法取数据的话就会报异常LazyInitializationException,错误信息表示session已经关闭,那么如何解决呢?单纯使数据层的session不关闭了?这样不行,因为当多用户访问时,可能会造成服务器当机.解决方法就是数据层的session到表示层再关闭,当我们在表示层将数据取出显示后,我们从当前线程中取出对应的数据层的session,然后再将其关闭.

7,hibernate的映射关系

单向的一对多:(在一的一方配置)streets表示多方

<set name="streets">

<key column="distract_id" />  必须添加关系键(一方的关系键)

<one-to-many class="com.tarena.entity.Street" />

</set>

单向的多对一:(在多的一方配置) distract表示一方

<many-to-one name="distract" class="com.tarena.entity.Distract" column="distract_id" />一定要添加一个外键列

插入多方需要先把一方插入后在插入多方 在多方设置cascade

cascade="" 默认:none"不使用任何级联操作delete:级联删除save-update:级联更新 all:级联删除、级联更新 

建议:在开发中避免使用

双向的一对多:在一方和多方都要进行配置,一般由多方维护关系键(一方配置文件中设置inverse="true"  表示由一方的对方(多方)进行管理)

多对多:

一般两个表示多对多关系的话,一般设置一个中间表,放置两个表的主键,并且分别是两个表的外键,

对象模型中 ,分别定义一个set集合的属性,在映射文件中配置多对多关系

8,update和saveOrUpdate区别?get方法和load方法的区别?

Update和saveOrUpdate区别:

save方法就是讲对象持久化成持久化状态,将对象的状态插入数据库

saveOrUpdate方法会根据对象id的不同来选择使用save或者update,当对象的id为null的时候就执行save方法,如果对象的id从来都没有被持久化过,也是执行save方法,其他的情况就会使用update.

get和load区别:

返回结果上:load方法如果检索不到结果的话会抛异常,get方法如果检索不到结果的话会返回null

检索机制上:load方法的检索机制非常复杂(检索缓存,判断lazy,查询数据库),get方法直接去数据库中进行检索

延迟加载上:load方法使用代理进行延迟加载,get方法不使用延迟加载

9,hibernate缓存机制(缓存为的是提高查询的效率)

[首先说明什么是缓存] 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用,这样就提高了查询的效率,减轻服务器的压力。

一级缓存(session缓存/事物缓存):

session其实就是一个Map<id,String>集合,只在一个session/事物/线程中有效.

支持:get方法,load方法,save方法(将对象添加到一级缓存中)

不支持:对象查询,对象属性查询,QBC

生命周期:一级缓存的生命周期其实与session同时创建同时消亡

管理:session. evict(obj)放逐出session缓存中某个对象.session.clear()清空一级缓存中的所有的对象

二级缓存(sessionFactory缓存):

实现在不同的session/事物/线程中数据的共享,二级缓存独立于Hibernate的软件部件,属于第三方的产品

使用:添加支持二级缓存的jar包ehcache-1.2.3.jar,添加配置文件ehcache.xml, 在hibernate.cfg.xml中配置二级缓存在实体映射文件(User.hbm.xml)中或者hibernate.cfg.xml中指明使用二级缓存的对象,

支持:get方法,load方法

不支持:对象查询,对象属性查询,QBC

查询缓存:

支持:属性查询

不支持:对象查询,QBC

查询一个对象建议使用二级缓存+查询缓存

10,hibernate锁机制

(1) 悲观锁

使用数据的方式完成,可以防止重复更新

select  * from  t_user user0_ where  user0_.user_id=? for update

用户执行完修改才会释放锁资源,其他用户可以查看这行信息,用户不释放锁资源,

其他用户只能处于等待状态,超过等待时间,就出现异常,连接超时  

对象查询时加入LockMode.UPGRADE

User user = (User)session.get(User.class, 1,LockMode.UPGRADE);

(2)乐观锁

乐观锁是hibernate提供的一种锁机制

乐观锁类似于版本管理器中的version,对一个对象进行更新操作时,首先判断当前的version是否跟之前查询时的version相同,如果相同的话,那么进行更新,如果不同,抛异常

使用方式:

(1)在对象模型中添加一个属性(version)(实体类中添加)private int version;

(2)在映射文件中设置使用锁的类型(User.hbm.xml中)

 <class name="com.sun.entity.User" table="t_user" optimistic-lock="version">

(3)* 配置version属性(User.hbm.xml中)<version name="version"/>

11,hibernate工作原理

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hibernate面试总结

制作人:Oak_Sun[2012-10-2]

相关推荐