Hibernate作为java技术大家族中举足轻重的数据处理层的框架所在,在前几年的深受java软件工程师的喜爱,虽然在现在新的java项目中被新框架所取代应用已经没有之前的那么多了,但是谁也不能否认Hibernate的强大。
虽然用的少了但是Hibernate作为经典框架所在包含了很多java所应用技术的精华所在,因此在日常的java面试中总能够见到几个关于Hibernate方面的题目。
下面就为大家在Hibernate面试题中常出现的题目最一个简单的总结。
1.Hibernate是如何延迟加载?
. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而
提高了服务器的性能。
2.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、
one-to-many、many-to-many、
3. 说下Hibernate的缓存机制
. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
. 二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现
4. Hibernate的查询方式
Session.get Session.load
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
5. 如何优化Hibernate?
.使用双向一对多关联,不使用单向一对多
.灵活使用单向一对多关联
.不用一对一,用多对一取代
.配置对象缓存,不使用集合缓存
.一对多集合使用Bag,多对多集合使用Set
.继承类使用显式多态
.表字段要少,表关联不要怕多,有二级缓存撑腰
6. get和load区别;
1)get如果没有找到会返回null, load如果没有找到会抛出异常。
2)get会先查一级缓存, 再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象,等需要的时候去查询二级缓存和数据库。
7. N+1问题。
Hibernate中常会用到set,bag等集合表示1对多的关系, 在获取实体的时候就能根据关系将关联的对象或者对象集取出。
解决方法一个是延迟加载, 即lazy=true;
一个是预先抓取, 即fetch=join;
8. inverse的好处。
在关联关系中用inverse在控制由哪一端来控制关联关系。这样做有什么好处呢?举customer和order的例子来说。他们是一对多的关系,如果只单向关联,且由customer控制关联关系,则如果我想添加一个order,则先取customer, 然后getOrders得到所有的order集合,然后往集合里面多加入一个order,然后save(customer), 这样开销太大。 如果改双向关联且由order主控关系,则如果想为customer增加一个order, 则new一个order,然后给order设置customer,然后save(order)即可。
9 ,merge的含义:
//cp3.iteye.com/blog/786019 这里写的好;
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例
最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的
10, persist和save的区别
persist不保证立即执行,可能要等到flush;persist不更新缓存;
11, cascade,用来指示在主对象和它包含的集合对象的级联操作行为,即对住对象的更新怎么影响到子对象;
save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
delete-orphan:删除所有和当前对象解除关联关系的对象
,12.怎么配置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的注解,从而不需要使用配置文件。
13.解释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进行关联时,瞬态对象就成为了持久层对象。
14,Hibernate中save、persist和saveOrUpdate这三个方法的不同之处? 除了get和load,这又是另外一个经常出现的Hibernate面试问题。 所有这三个方法,也就是save()、saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别。例如,save()只能INSERT记录,但是saveOrUpdate()可以进行记录的INSERT和UPDATE。还有,save()的返回值是一个Serializable对象,而persist()方法返回值为void。你还可以访问 save、persist以及saveOrUpdate,找到它们所有的不同之处。,
15,Hibernate中的命名SQL查询指的是什么? Hibernate的这个面试问题同Hibernate提供的查询功能相关。命名查询指的是用标签在影射文档中定义的SQL查询,可以通过使用Session.getNamedQuery()方法对它进行调用。命名查询使你可以使用你所指定的一个名字拿到某个特定的查询。 Hibernate中的命名查询可以使用注解来定义,也可以使用我前面提到的xml影射问句来定义。在Hibernate中,@NameQuery用来定义单个的命名查询,@NameQueries用来定义多个命名查询。
16,Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗? 这也是Hibernate框架的常见面试问题。顾名思义,SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。Java JEE应用一般只有一个SessionFactory,服务于客户请求的各线程都通过这个工厂来获得Hibernate的Session实例,这也是为什么SessionFactory接口的实现必须是线程安全的原因。还有,SessionFactory的内部状态包含着同对象关系影射有关的所有元数据,它是 不可变的,一旦创建好后就不能对其进行修改了。
选择题区
1. 级联删除时,cascade属性是( c )。
A. all
B. save
C. delete
D. save-update
2. 以下不属于Cascade的属性取值的有( b )。
A. all
B. save
C. delete
D. save-update
3. 关于HQL查询,下列说法中错误的是( A )。
A. HQL查询的select子句中必须区分大小写
B. HQL支持统计函数
C. HQL支持仅查询对象的某几个属性,并将查询结果保存在Object数组中
D. HQL语句可以实现类似于PreparedStatement的效果
4. 由持久化状态向游离状态转变的方法不包括( C)。
A. 临时状态
B. 无引用状态
C. 持久化状态
D. 游离状态
5. 关于HQL与SQL,以下哪些说法正确?(B)。
A. HQL与SQL没什么差别
B. HQL面向对象,而SQL操纵关系数据库
C. 在HQL与SQL中,都包含select,insert,update,delete语句
D. HQL仅用于查询和删除数据,不支持insert,update语句
6. 下面关于Hibernate说法正确的是(BD)。(选择两项)
A. Hibernate是ORM的一种实现方式
B. Hibernate不要JDBC的支持
C. 属于控制层
D. 属于数据持久层
7. 下面关于Hibernate中load和get方法说法正确的是(D)。
A. 这两个方法是一样的,没有任何的区别
B. 这两个方法不一样,laod先找缓存,再找数据库
C. 这两个方法不一样,get先找缓存,再找数据库
D. 以上说法都不对
8. 关于Hibernate中关系的说话正确的是(A)。
A. 一对多必须用Set来映射
B. 多对一必须用Set来映射
C. 一对多可以用Set来映射,也可以用List、Map来映射
D. 多对一可以用Set来映射,也可以用List、Map来映射
9. 以下关于SessionFactory的说法哪些正确?( C)。
A. 对于每个数据库事务,应该创建一个SessionFactory对象
B. 一个SessionFactory对象对应多个数据库存储源
C. SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个
D. SessionFactory的load()方法用于加载持久化对象
10. 在使用了Hibernate的系统中,要想在删除某个客户数据的同时删除该客户对应的所有订单数据,下面方法可行的是(A)。
A. 配置客户和订单关联的cascade属性为save-update
B. 配置客户和订单关联的cascade属性为all
C. 设置多对一关联的inverse属性为true
D. 设置多对一关联的inverse属性为false
11
在三层结构中,数据访问层承担的责任是()
a)定义实体类
b)数据的增删改查操作
c)业务逻辑的描述
d)页面展示和控制转发
12
下面关于数据持久化概念的描述,错误的是()〔选择一项〕
a)保存在内存中数据的状态是瞬时状态
b)持久状态的数据在关机后数据依然存在
c)数据可以由持久状态转换为瞬时状态
d)将数据转换为持久状态的机制称为数据持久化
13.下面( ab)不是Hibernate 映射文件中包含的内容。(选两项)
A.数据库连接信息
B.Hibernate 属性参数
C.主键生成策略
D.属性数据类型
14. Hibernate对象从临时状态到持久状态转换的方式有?( A)。
A. 调用session的save方法
B. 调用session的close方法
C. 调用session的clear方法
D. 调用session的evict方法
15下面关于Hibernate的说法,错误的是()〔选择一项〕
a) Hibernate是一个”对象-关系映射”的实现
b) Hibernate是一种数据持久化技术
c) Hibernate是JDBC的替代技术
d) 使用Hibernate可以简化持久化层的编码
16Hibernate配置文件中,不包含下面的()〔选择二项〕
a) “对象-关系映射”信息
b) 实体间关联的配置
c) show_sql等参数的配置
d) 数据库连接信息
17下面不是Hibernate映射文件中包含的内容。(选两项)
a) 数据库连接信息
b) Hibernate属性参数
c) 主键生成策略·
d) 属性数据类型
18在使用了Hibernate的系统中,要想在删除某个客户数据的同时删除该客户对应的所有订单数据,下面方法可行的是()。〔选择一项〕
a) 配置客户和订单关联的cascade属性为save-update
b) 配置客户和订单关联的cascade属性为all
c) 设置多对一关联的inverse属性为true
d) 设置多对一关联的inverse属性为false
19以下程序的打印结果是什么?
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
d) 编译出错
Java热点新闻