Hibernate面试问题集锦: 概述
ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一。你可以从这里查看全部的Java面试系列。
Q.怎么配置Hibernate?
A.Configuration类使用配置hibernate.cfg.xml(或者hibernate.properties)以及映射文件*.hbm.xml来创建(例如,配置和引导hibernate)SessionFactory,然后SessionFactory创建Session的实例。Session的实例是持久层服务对外提供的主要接口。
hibernate.cfg.xml(或者你也可以使用hibernate.properties):这两个文件都是用来配置hibernate服务(数据库连接的驱动类,连接URL,用户名,密码,方言等)。如果这两个文件同时存在于classpath里的话,那么hibernate.cfg.xml会覆盖hibernate.properties文件里的配置。
映射文件(*.hbm.xml):这些文件都是用来对持久层对象和关系数据库进行映射的。最好的方式是对每个对象都使用单独的映射文件(例如一个类一个文件),因为如果在一个文件里存放大量的持久层对象,那么这个文件就变得非常难管理和维护。约定的命名方式是映射文件名和持久层类名(POJO)保持一致。例如,Account.class的映射文件名为Account.hbm.xml。或者,你也可以在类文件的代码里加上hibernate的注解,从而不需要使用配置文件。
Q.什么是SessionFactory?它是线程安全的吗?
A.SessionFactory对应Hibernate的一个数据存储的概念,并且它是线程安全的,可以被多个线程并发访问,也可以请求session和单个数据库的不可变编译过的映射的缓存。SessionFactory一般只会在启动的时候构建。对于应用代码,最好对SessionFactory通过单例的模式进行封装以便于访问。
|
1
|
SessionFactory sessionFactory = new Configuration( ).configure( ).buildSessionfactory( ); |

Q.Session是什么?两个线程能共享同一个session吗?
A.Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是被SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用ThreadLocal来取得当前的session,无论你调用多少次currentSession()方法,返回的都是同一个session。下面是示例代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class HibernateUtil { public static final ThreadLocal local = new ThreadLocal(); public static Session currentSession() throws HibernateException { Session session = (Session) local.get(); //open a new session if this thread has no session if(session == null) { session = sessionFactory.openSession(); local.set(session); } return session; }} |
有一点很重要的就是如果一个工作单元完成了,你需要关闭你的session。注意:保持你的Hibernate Session API简单易用。比较常见的场景是,hibernate会和Spring框架一起使用,通过HibernateTemplate来整合。
Q.解释hibernate对象的状态?解释hibernate对象的生命周期?
A.持久层(persistent )对象和集合都是存活时间短暂的单线程对象,它们保存持久层的状态。这些对象的状态会根据你的刷新规则(例如,一旦有setXXX()方法被调用了就自动刷新,或者有数据项从集合、列表等删除时就刷新,你也可以通过session.flush()和transaction.commit()这两个函数调用来定义你自己的同步策略)来与数据库保持同步。如果你从一个持久层的集合(例如Set)里删除一项,那么它要么被立即从数据库里删除,或者当flush()或则commit()方法被调用时删除,具体的表现取决于你的刷新策略。它们都是普通的Java对象(POJO,Plain Old Java Object),只不过当前关联了一个session。一旦关联的session被关闭,持久层对象就成为了游离对象(detached object),这时候你就可以在随便使用它们了,就像是用在业务层,持久层等其他应用层面的数据传输对象一样。
游离(detached )对象和集合都是和session相关联的持久层对象的实例,只不过它们现在没有和session进行关联。这种对象可以被随便使用,它不会对你的数据库有任何影响。游离对象后面也可以通过调用类似session.update(),session.saveOrUpdate()等方法来依附到其他的session上,然后再次成为持久层对象。
瞬态(transient)对象和集合是从来没有和session相关联的持久层对象的实例。这些对象可以自由使用,并且不会对你的数据库造成任何影响。当通过session.save(),session.persist()方法来使得瞬态对象和一个session进行关联时,瞬态对象就成为了持久层对象。

Q.使用游离对象(detached object)有什么好处呢?
优点:
- 当因用户的思考时间而需要使用长事务时,最好的方式是把长事务分成一个或者多个事务。你可以使用来自于第一个事务的游离对象来承载持久层的所有数据。这些游离的对象在事务外被修改,然后可以通过另一个session来加入到新的事务里。
缺点:
- 一般来说,使用游离对象的方式是比较笨重的,并且如果可以的话最好不要使得session变得比较混乱。最好的方式是丢弃这些对象,然后在后面的请求里重新获取新的对象。这个方式不仅更具有移植性,而且更加高效——因为这些对象会留在Hibernate的缓存里。
- 同时,从纯粹的富领域驱动的方式来看,比较推荐的方式是使用DTO(DataTransferObject)和DO(DomainObject)来保持Service层和UI层之间的分离。
Q.什么时候对象会变成游离的?
A.
|
1
2
3
4
5
|
Session session1 = sessionFactory.openSession();Car myCar = session1.get(Car.class, carId); //“myCar”这个时候是一个持久层对象session1.close(); //当session关闭时,“myCar”就成为了游离对象 |
现在你可以把“myCar”对象传到一直传到表示层里。它可以被修改并且对数据库表没有影响。
|
1
|
myCar.setColor(“Red”); //对数据库没有影响 |
当你需要把修改持久化到数据库时,可以把游离对象加入到另外一个session里,示例如下:
|
1
2
3
4
5
6
7
8
9
|
Session session2 = sessionFactory.openSession();Transaction tx = session2.beginTransaction();session2.update(myCar); //游离对象”myCar“加入到sessiontx.commit(); //修改被同步到数据库session2.close() |
Q.Hibernate怎么区别瞬态对象(例如,刚实例化的)和游离对象?
A.
- 如果存在”version”这个属性的话,Hibernate会使用它来进行区别。
- 如果不存在的话,会使用标识符值(identifier value)来进行判断。没有标识符表示这是一个新对象。这只适合Hibernate管理代理主键(surrogate key)的场景,不适合于使用自然主键(natural key)或者assigned代理主键(没有被Hibernate管理)的场景。
- 通过InterceptorisUnsaved()来实现你自己的策略。
注意:当你重新关联游离的对象时,你必须保证依赖的对象也都被重新进行关联。
注意:这些问题都是来自于我的《Java/J2EE Job Interview Companion》一书。
英文原文:Java Success,编译:ImportNew - 朱伟杰
Hibernate面试问题集锦: 概述的更多相关文章
- 【转】Hibernate面试问题集锦: 概述
ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置Hibernate? A.Configuration类使用配 ...
- Hibernate问题集锦: 概述
Hibernate问题集锦: 概述 ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置hibernate? ...
- .NET面试问答集锦
程序员级别鉴定书(.NET面试问答集锦) 提供避免元素命名冲突的方法 DOM适合的使用场景是什么?是否有尺寸限制? DOM是一种与浏览器,平台,语言无关的接口,使你可以访问页面其他的标准组件. DOM ...
- C#面试考点集锦
C#面试考点集锦 ©智客坊 岁末年初往往是程序猿准备跳槽的高峰,当然互联网行业跳槽几乎是每个月都在发生,没有太过明显的淡季~那么,如何提高面试的通过率,最终顺利的拿到自己心仪的offer呢? ...
- 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作
spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...
- JAVA工程师面试常见问题集锦
集锦一: 一.面试题基础总结 1. JVM结构原理.GC工作机制详解 答:具体参照:JVM结构.GC工作机制详解 ,说到GC,记住两点:1.GC是负责回收所有无任何引用对象的内存空间. 注意: ...
- 【Hibernate】Hibernate系列1之概述
概述 Hibernate简介 1.2.安装hibernate tools插件 1.3.HelloWorld示例 1.3.1.加入jar包 1.3.2.开发步骤 hibernate generator ...
- C#和ASP.Net面试题目集锦
1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程. ...
- 转 MySQL数据库面试问题集锦
如何设计一个高并发的系统 ① 数据库的优化,包括合理的事务隔离级别.SQL语句优化.索引的优化 ② 使用缓存,尽量减少数据库 IO ③ 分布式数据库.分布式缓存 ④ 服务器的负载均衡 锁的优化策略 ① ...
随机推荐
- Spring 管理Filter和Servlet
本文转载自:http://www.open-open.com/lib/view/open1417248512252.html 在使用spring容器的web应用中,业务对象间的依赖关系都可以用cont ...
- BZOJ3963: [WF2011]MachineWorks 【CDQ+斜率优化DP】*
BZOJ3963: [WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)
我们在之前谈过 语义版本号(Semantic Versioning),在项目中应用语义版本号能够帮助库的开发者在发布包时表明更多的语义信息.这是趋势,从微软的博客 Versioning NuGet p ...
- 重温CLR(十六) CLR寄宿和AppDomain
寄宿(hosting)使任何应用程序都能利用clr的功能.特别要指出的是,它使现有应用程序至少能部分使用托管代码编写.另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展的能力. 允许可扩展性意味着 ...
- 《DSP using MATLAB》示例Example 8.15
- 隐藏控件HiddenField使用
HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据. 增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全面 ...
- HDU4864 Task
题意 Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, t ...
- django gunicorn 各worker class简单性能测试
版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/564871723/ ====================== ...
- zipkin之brave
brave是同步收集信息,及计算调用时间,但是异步发送日志信息给zipkin:所以很多时候你无法在第一时间获取日志数据可能需要等一会.另外在写一个demo的时候,因为最后睡了1秒,经常会发现丢了一些日 ...
- mysql设置合适的索引长度
理想的索引: 相对于写操作来说,表查询很频繁的表建立索引 字段区分度高 长度小(合适的长度,不是越小越好) 尽量能够覆盖常用字段 这些条件综合起来才能够达到最优索引,本次我们着重聊一下建立合适长度的索 ...