admin 管理员组

文章数量: 887629


2024年1月10日发(作者:nginx负载均衡权重)

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 = Query(“from Customer as c

where =: customerName”);

ing(“customerName”,”张三”); List

resultList = ();

(4)QBC查询方式。这种API封装了基于字符串形式的查询语句。

Criteria criteria = Criteria();

Criterion criterion1 = (“name”,”T%”);

Criterion criterion2 = (age,new

Integer(30));

criteria = (criterion1);

criteria = (criterion2);

List resultList = ();

这种查询方式使用的较少,主要是在查询中需要用户输入一系列的查询条件,如果采用HQL查询代码会比较烦。

(5)本地SQL查询

三.Hibernate的检索策略有几种?

立即检索----立即加载检索方法指定的对象。

延迟检索----延迟加载检索方法指定的对象,只有当初次获取其属性或调用其方法时才加载。

如果将元素的lazy熟悉设置为true,那么Load()方法是延迟加载。

而不管lazy是true或false,get()和find()方法永远是立即检索。

()和()的区别

/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个

ObjectNotFoundException。执行load方法并不会真正去查询DB,只有当首次访问实体对象属性时才会去DB中真正查询。(即懒加载)

Load方法返回实体的代理类实例,而get方法永远直接返回实体类。

load支持延迟加载,get不支持延迟加载。

load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法那么仅仅在内部缓存中进展数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

四.Hibernate的缓存

Hibernate有2级缓存。

第一级缓存是session缓存,其是事务范围内的缓存,第一级缓存也是必需要的,无法去除。在第一级缓存中,每个持久化的实例对象都有一个OID.

第二级缓存是SessionFactory的外置缓存,是一个可以插拔的缓存插件,由SessionFactory负责管理。第二级缓存是进程范围内的或者群集范围内的缓存。

一.Hibernate中对象的状态有几种?

3种状态,瞬时状态,持久化状态,游离状态。

(1) 瞬时状态----刚用new语句创立,尚未持久化,没有被session所关联,DB中也没有对

象的记录。

(2) 持久化状态----跟session关联,跟数据库中的相关记录对应。

(3) 游离状态-----由持久化对象转变而来,不再和session关联,数据库中有可能存在与

之对应的记录。

二.Hibernate中关于继承关系的映射方式

(1)每个类分层构造一张表

优点:简单,只需要一张表,查询效率高。

缺点:需要在表中引入额外区分各个子类的字段,不能为所有的子类成员属性对应的字段定义Not null约束。

适用范围:查询性能要求高,子类属性不是很多时。

(2)每个子类一张表,每张表中仅仅包含在当前类中定义的属性,不包含父类或子类的成员属性。

优点:支持多态查询和关联查询,符合关系数据模型的设计规那么。 缺点:查询效率不是很高,需要通过表的内连接或左外连接进展查询。 适用范围:子类属性非常多,需要对子类某些属性对应的字段加Not null约束,且对性能要求不是很高时。

(3)每个详细类一张表,每张表中包含在当前类及其父类中的所有成员属性对应的字段。

优点:可以对子类的成员属性定义Not null约束。 缺点:不符合关系数据模型的设计规那么,而且每个表中都存在基类的多余字段。 适用范围:一般不使用。

三.数据库事务隔离级别

数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Unmited的隔离级别最低。大多数据库默认

的隔离级别为Read Commited,如SqlServer,当然也有少部分数据库默认的隔离级别为Repeatable Read ,如Mysql

? Read Unmited:读未提交数据(会出现脏读,不可重复读和幻读)。

? Read Commited:读已提交数据(会出现不可重复读和幻读)

? Repeatable Read:可重复读(会出现幻读)

? Serializable:串行化

1. 请说出Hibernate中持久化对象的生命周期以及各种状态直接的区别,并描述相互之间是如何转换的。

Hibernate中持久化对象的生命周期有临时态、持久态和游离态三种。

处于临时态的对象主键值为空,并且未与session关联,数据未保存到数据库中

处于持久态的对象与session关联起来,持久化后对象中的数据被保存到数据库中,并且主键值按照.文件中配置的生成方式生成相应的值

处于游离态的对象脱离了session的管理,是持久化后的一种状态,主键值按照.文件中配置的生成方式生成相应的值

当new一个新的对象时,该对象处于临时态

当该对象被当作session的参数使用的时候,该对象处于持久态

事务提交,session关闭后,该对象处于游离态

ate与数据库连接的实现?并解释了一下,例如文件是通过流来实现的!hibernate与数据库连接是通过什么实现的?

Hibernate与数据库的连接是通过JDBC实现的

和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.具有业务含义的字段的取值范围不定。可能是纯数字,也可能是纯字符,或者是数字和字符的混合情况。

上述两个方面一但发生变动将不利于业务层的处理。


本文标签: 对象 查询 方式