- 相关推荐
hibernate面试题及答案
求职应聘,面试技巧的准备是必不可少的环节。快来学习hibernate面试题及答案啦,增加面试通过率,阳光网小编带你一起学习。
hibernate面试题及答案(一)
一. Hibernate工作使用步骤?
1. 读取并解析配置文件
2. 读取并解析映射信息,创建SessionFactory
3. 打开Sesssion
4. 创建事务Transation
5. 持久化操作
6. 提交事务
7. 关闭Session
8. 关闭SesstionFactory
二.Hibernate的查询方式有几种?
(1)导航对象图检索方式。根据已经加载的对象,导航到其他对象。
(2)OID查询方式。根据对象的OID来查询对象。Session的get()和load()方法。
(3)HQL查询方式。HQL是面向对象的查询语言,session的find()方法用于执行HQL查询语句。可以利用Query接口。
Query query = session.createQuery(“from Customer as c where c.name =: customerName”);
query.setString(“customerName”,”张三”); List resultList = query.list();
(4)QBC查询方式。这种API封装了基于字符串形式的查询语句。
Criteria criteria = session.createCriteria(User.class); Criterion criterion1 = Expession.like(“name”,”T%”);
Criterion criterion2 = Expession.eq(age,new Integer(30));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
List resultList = criteria.list();
这种查询方式使用的较少,主要是在查询中需要用户输入一系列的查询条件,如果采用HQL查询代码会比较烦。
(5)本地SQL查询
三.Hibernate的检索策略有几种?
立即检索----立即加载检索方法指定的对象。
延迟检索----延迟加载检索方法指定的对象,只有当初次获取其属性或调用其方法时才加载。
如果将<class>元素的lazy熟悉设置为true,那么Load()方法是延迟加载。
而不管lazy是true或false,get()和find()方法永远是立即检索。
session.load()和session.get()的区别
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个
ObjectNotFoundException。执行load方法并不会真正去查询DB,只有当首次访问实体对象属性时才会去DB中真正查询。(即懒加载)
Load方法返回实体的代理类实例,而get方法永远直接返回实体类。
load支持延迟加载,get不支持延迟加载。
load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
四.Hibernate的缓存
Hibernate有2级缓存。
第一级缓存是session缓存,其是事务范围内的缓存,第一级缓存也是必需要的,无法清除。在第一级缓存中,每个持久化的实例对象都有一个OID.
第二级缓存是SessionFactory的外置缓存,是一个可以插拔的缓存插件,由SessionFactory负责管理。第二级缓存是进程范围内的或者群集范围内的缓存。
hibernate面试题及答案(二)
一.Hibernate中对象的状态有几种?
3种状态,瞬时状态,持久化状态,游离状态。
(1) 瞬时状态----刚用new语句创建,尚未持久化,没有被session所关联,DB中也没有对
象的记录。
(2) 持久化状态----跟session关联,跟数据库中的相关记录对应。
(3) 游离状态-----由持久化对象转变而来,不再和session关联,数据库中有可能存在与
之对应的记录。
二.Hibernate中关于继承关系的映射方式
(1)每个类分层结构一张表
优点:简单,只需要一张表,查询效率高。
缺点:需要在表中引入额外区分各个子类的字段,不能为所有的子类成员属性对应的字段定义Not null约束。
适用范围:查询性能要求高,子类属性不是很多时。
(2)每个子类一张表,每张表中仅仅包含在当前类中定义的属性,不包含父类或子类的成员属性。
优点:支持多态查询和关联查询,符合关系数据模型的设计规则。 缺点:查询效率不是很高,需要通过表的内连接或左外连接进行查询。 适用范围:子类属性非常多,需要对子类某些属性对应的字段加Not null约束,且对性能要求不是很高时。
(3)每个具体类一张表,每张表中包含在当前类及其父类中的所有成员属性对应的字段。
优点:可以对子类的成员属性定义Not null约束。 缺点:不符合关系数据模型的设计规则,而且每个表中都存在基类的多余字段。 适用范围:一般不使用。
三.数据库事务隔离级别
数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。大多数据库默认的隔离级别为Read Commited,如SqlServer,当然也有少部分数据库默认的隔离级别为Repeatable Read ,如Mysql
Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。
Read Commited:读已提交数据(会出现不可重复读和幻读)
Repeatable Read:可重复读(会出现幻读)
Serializable:串行化
hibernate面试题及答案(三)
1. 请说出Hibernate中持久化对象的生命周期以及各种状态直接的区别,并描述相互之间是如何转换的。
Hibernate中持久化对象的生命周期有临时态、持久态和游离态三种。
处于临时态的对象主键值为空,并且未与session关联,数据未保存到数据库中
处于持久态的对象与session关联起来,持久化后对象中的数据被保存到数据库中,并且主键值按照.hbm.xml文件中配置的生成方式生成相应的值
处于游离态的对象脱离了session的管理,是持久化后的一种状态,主键值按照.hbm.xml文件中配置的生成方式生成相应的值 当new一个新的对象时,该对象处于临时态
当该对象被当作session的参数使用的时候,该对象处于持久态
事务提交,session关闭后,该对象处于游离态
2.hibernate与数据库连接的实现?并解释了一下,例如文件是通过流来实现的!hibernate与数据库连接是通过什么实现的? Hibernate与数据库的连接是通过JDBC实现的
3.spring和hibernate的事务管理方式有什么不同? hibernate的事务管理方式仅仅就是托管给JDBC(如果用JTA那么就是JTA),而JDBC的一切行为包括事务是基于一个connection的,那么hibernate委托给JDBC的事务也就是基于一个session。JTA与JDBC事务不同在于可以跨连接。
spring也是调用hibernate中事务管理的API。hibernate的事务管理,一般是编程性的。而委托给spring之后,可以使用声明式的,也就是可以在XML之中配置哪些需要进行事务管理,哪些不需要
4.用hibernate的session时要注意几点
1.在更新数据时,要用open()
2.使用完之后,要close(),这样连接池会回收该连接。
5.说说在hibernate中使用Integer做映射和使用int做映射之间有什么差别
使用int做映射,hibernate会自动把int类型转换为Integer类型,以便统一以对象方式处理数据。使用Integer就无须转换。 在从数据库中取数据的时候,如果是用Integer做的映射,则要求PO对象中对应的类型也必须为Integer类型,使用的时候需要转换为int。如果是int型,则无须转换。
6.一个网站应用,请设计一个持久化类User,他可能有多张会员卡号、需要多个email地址(数量不定)作为其身份验证的方式
设计三个类。User类、会员卡类和email类。User类与会员卡类和email类之间是一对多的关系
7.请简单评价该设计的优劣:身份证号码作为一个person表的主键
一个表的主键值设计最好不要采用具有业务含义的字段。理由有二:
1.具有业务含义的字段的长度不固定
2.具有业务含义的字段的取值范围不定。可能是纯数字,也可能是纯字符,或者是数字和字符的混合情况。
上述两个方面一但发生变动将不利于业务层的处理。
【hibernate面试题及答案】相关文章:
经典面试题及答案04-04
面试题及答案04-04
小升初面试题及答案12-09
经典的面试题及答案分析12-09
sql面试题及答案04-03
php面试题及答案04-02
android面试题及答案04-04
逻辑面试题及答案12-09
护士面试题及答案11-26