首页>JAVA>正文

划重点:Java三大框架SSH之Hibernate面试题集锦

时间:2018-12-06 15:57:38   来源:上海尚学堂   阅读:
Hibernate是Java三大框架SSH(Struts,Spring,Hibernate)之一,有关Hibernate的Java面试题非常多,是Java面试中必定要考察的重点知识。上海尚学堂Java培训老师选择了几个非常具有代表性的常见问题,配有详细答案,帮助大家重温Hibernate,后续文章再回顾Struts,Spring

一、Hibernate工作原理,为什么要用Hibernate?

1.1 Hibernate原理:

1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Session
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory


1.2 为什么要用Hibernate:

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

二、Hibernate是如何延迟加载?

1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)。

2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。  
 

三、Hibernate中怎样实现类之间的关系?

(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many 

四、Hibernate有哪几种查询数据的方式

有hql查询,sql查询,条件查询三种方式。



五、谈谈hibernate的延迟加载和openSessionInView

延迟加载要在session范围内,用到的时候再加载;opensessioninview是在web层写了一个
filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟
加载在session中的这个前提。


六、Hibernate中的update()和saveOrUpdate()的区别

hibernate save :对于save方法没次使用的时候都要重新new 一个对象出来或者session.flush ,session.clear ,并且这种要求id是自动生成的,如果没有进行session操作,在操作的时候实际上一直更新这个对象,这和update没有任何区别

update:在大部分使用update语句之前都要获取到这个对象,这样才能保证id是获取到了,并且是实际上的更新,不然可能会包异常,更新语句伴随load或者get而使用

saveOrUpdate:有些情况下并不知道我们获得到的对象或者构造的对象,数据库中有没有,这个时候就会使用这个方法,这个方法的使用一般是id自动生成的,如果不是很有可能会出现id为空的现象。

顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别。
通常下面的场景会使用update()或saveOrUpdate(): 
程序在第一个session中加载对象,接着把session关闭 
该对象被传递到表现层 
对象发生了一些改动 
该对象被返回到业务逻辑层最终到持久层 
程序创建第二session调用第二个session的update()方法持久这些改动

saveOrUpdate(po)做下面的事: 
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事 
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常 
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象
 

七、load()和get()的区别

hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数 据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该对 象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在 load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get() 现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
 

八、iBatis与Hibernate有什么相同和不同点?

相同点:
屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。
jdbc api编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。

ibatis的好处:
屏蔽jdbc api的底层访问细节;
将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;
提供了自动将实体对象的属性传递给sql语句的参数。
 
不同点:
Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。


更多有关Hibernate的信息请查看《Hibernate三种状态以及转换关系,Session加载过程_上海java培训》、《Hibernate的悲观锁和乐观锁两种锁机制》,获取Java全套学习资料视频或者预定免费试学机会请联系客服小姐姐。

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫