面试题首页 > Hibernate面试题

Hibernate面试题

001什么是 ORM 框架?

ORM是Object Relation Mapping的缩写,意思是对象关系映射,是把数据库中的关系数据映射成为程序中的对象。使用 ORM 的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。

002简单介绍下Hibernate。

Hibernate是持久层框架,通过对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

003Hibernate的优点?

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

004Hibernate工作原理?

1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory

005Hibernate 对象有哪些状态?

临时/瞬时状态:直接 new 出来的对象,该对象还没被持久化(没保存在数据库中),不受 Session 管理。
持久化状态:当调用 Session 的 save/saveOrupdate/get/load/list 等方法的时候,对象就是持久化状态。
游离状态:Session 关闭之后对象就是游离状态。

006Hibernate中get和load区别?

数据查询时,没有 OID 指定的对象,get() 返回 null;load() 返回一个代理对象。
load()支持延迟加载;get() 不支持延迟加载。

007在Hibernate 中getCurrentSession 和 openSession 的区别是什么?

getCurrentSession 会绑定当前线程,而 openSession 则不会。
getCurrentSession 事务是 Spring 控制的,并且不需要手动关闭,而 openSession 需要我们自己手动开启和提交事务。

008如何在控制台看到Hibernate生成并执行的sql?

在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true,这样生成的SQL就会在控制台出现了。注意:这样做会加重系统的负担,不利于性能调优。

009Hibernate中save、persist和saveOrUpdate这三个方法的不同之处?

都是用于将对象保存到数据库中的方法。
1)save()只能执行INSERT操作,会立即执行Sql insert,save()的返回值是一个Serializable对象;
2)saveOrUpdate()可以进行 记录的INSERT和UPDATE;
3)persist不保证立即执行,可能要等到flush;persist不更新缓存;persist()方法返回值为void;

010Hibernate是如何延迟加载?

通过设置属性lazy进行设置是否需要懒加载。当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

011说一下 Hibernate 的缓存机制?

Hibernate 常用的缓存有一级缓存和二级缓存:
一级缓存:也叫 Session 缓存,只在 Session 作用范围内有效,不需要用户干涉,由 hibernate 自身维护,可以通过:evict(object)清除 object 的缓存;clear()清除一级缓存中的所有缓存;flush()刷出缓存;
二级缓存:应用级别的缓存,在所有 Session 中都有效,支持配置第三方的缓存,如:EhCache。

012Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)?

通过配置文件中的many-to-one、one-to-many、many-to-many来实现类之间的关联关系的。

013可不可以将Hibernate的实体类定义为final类?

可以将Hibernate的实体类定义为final类,但不建议这么做。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。

014在Hibernate 中使用 Integer 和 int 做映射有什么区别?

Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。

015为什么在Hibernate的实体类中要提供一个无参数的构造器?

Hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法 ,这个方法就是通过调用默认构造方法来创建实例对象的 。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。

016Hibernate 如何进行批量更新?

Hibernate在做插入操作时会把要操作的对象全部放到自身的内部缓存来进行管理。当海量数据插入的时候,会有很多对象被纳入内部缓存,就可能出现OutOfMemoryError(内存溢出异常),因此最好做到如下三点:
1.做海量数据批量操作一定要关闭控制台显示执行的sql语句;
2.绕过Hibernate API ,直接通过 JDBC API 来做,这个方法性能上是比较好的,也是最快的;
3.如果还是使用Hibernate API ,使用分段插入。

017如何优化Hibernate?

1)HQL优化
2)API的正确使用(如根据不同的业务类型选用不同的集合及查询API)
3)主配置参数(日志,查询缓存,fetch_size, batch_size等)
4)映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)
5)一级缓存的管理
6)针对二级缓存,还有许多特有的策略

018一般情况下,关系数据模型与对象模型之间有哪些匹配关系(ABC)。

A. 表对应类
B. 记录对应对象
C. 表的字段对应类的属性
D. 表之间的参考关系对应类之间的依赖关系

019以下关于SessionFactory的说法哪些正确?(BC)

A. 对于每个数据库事务,应该创建一个SessionFactory对象
B. 一个SessionFactory对象对应一个数据库存储源。
C. SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个。
D. SessionFactory的load()方法用于加载持久化对象

020关于HQL与SQL,以下哪些说法正确?(BD)

A. HQL与SQL没什么差别
B. HQL面向对象,而SQL操纵关系数据库
C. 在HQL与SQL中,都包含select,insert,update,delete语句
D. HQL仅用于查询数据,不支持insert,update和delete语句

021以下哪些属于Session的方法?(ABCDF)

A. load()
B. save()
C. delete()
D. update()
E. open()
F. close()

022以下程序的打印结果是什么?(C)

tx = session.beginTransaction();
Customer c1=(Customer)session.load(Customer.class,new Long(1));
Customer c2=(Customer)session.load(Customer.class,new Long(1));
System.out.println(c1==c2);
tx.commit();
session.close();
A. 运行出错,抛出异常
B. 打印false
C. 打印true

023元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(D)

A. none
B. save
C. delete
D. save-update

024执行以下程序,Hibernate需要向数据库提交几条update语句?(B)

以下程序代码对Customer的name属性修改了两次:(B)

tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,new Long(1));
customer.setName(\"Jack\");
customer.setName(\"Mike\");
tx.commit();
A. 0 
B. 1 
C. 2 
D. 3

025在持久化层,对象分为哪些状态?(ACD)

A. 临时状态
B. 独立状态
C. 游离状态
D. 持久化状态

目录

返回顶部