hibernate面试题

时间:2020-10-23 12:39:07 面试 我要投稿

hibernate面试题汇总

1. 请解释Hibernate3.2主键的生成方式中,native和identity方式的区别。

hibernate面试题汇总

Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式

特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

Identity根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。

特点:与底层数据库有关,要求数据库支持Identity,如

MySQl中是auto_increment,

SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。

Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。

2. 请解释为什么SessionFactory一般以单利方式使用。

SessionFactory是一个大型对象,而且线程安全。在一个程序中只需要一个

3. 请解释说明hibernate配置文件中dialect属性的确切含义。

数据库方言:多种数据库拥有不同的语言语法,通过设置dialect指定所用的数据库,并生成对应语法和语言的sql语句。

4,请解释说明Hibernate控制下的POJO<对象>会呈现三种状态,分别是transient、persistenet和detached,请解释这三种状态。

暂态:数据库中没数据。跟session不相关。没存过。

游离态:在数据库中有记录,但是在session中没有。需要手工同步。

持久态:数据库中有记录,session中也有这记录。自动更新

5. 请解释Session的load方法和get方法的不同;

load 在加载的时候会根据加载策略来加载东西,加载策略默认为延迟加载,即只加载id.,如果需要用其它数据,必须在session关闭之前,去加载某一 个属性。lazy="true" or "false" 如果加载策略是立即加载,那么它在加载时会把数据信息全部加载,这个时候即使,关闭session,因为数据已经全部加载了,也能取得数据

get 会直接采用立即加载策略加载数据,不管你配置的是延迟加载还是立即加载

关于立即加载和延迟加载 不仅只对自己这张表,将来表与表之间有关系时,一样会起作用。

如果对象不存在 get返回null load抛异常

6.请解释cascade属性和-orphan的区别。

: 在执行 时进行关联操作。

all--orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。

7.请解释inverse属性的作用

inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse="true"表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。 one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。

8.请解释Hibernate查询中出现的N+1问题,并提出解决方案。

Hibernate在检索与Customer关联的Order对象时,使用了默认的立即检索策略。这种检索策略存在两大不足:

(1) select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。

(2)在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。

为了解决以上问题,Hibernate提供了其他两种检索策略:延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免多余加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目。

9.请简要的描述一下使用Hibernate进行大批量更新的经验;

直接使用hibernate API 进行批量更新和批量删除都不推荐,而直接通过JDBC API执行相关的SQl语句或调用相关的存储过程是最佳的方式。

10,请简要的描述一下使用Hibernate二级高速缓存的经验

1.Hibernate3的二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存;

2.sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变化的实体对象放到sessionFactory级别的.缓存中,适合放不经常变化的实体对象。)

3.Hiberante3二级缓存的配置和使用方法如下:

必须把ehcache.jar包导入,然后到Hibernate3.2的etc文件下把ehcache.xml复制到工程src目录下(ehcache.xml里边的参数里边有详细英文说明);

说明:ehcache.jar是第三方法的缓存产品,hiberante只是把它做了集成,还有好多第三方hibernate集成的缓存产品,相关说明请查阅hiberante3开发手册;ehcache是不支持分布应用的,如果有分布式需求,请换成支持分布式的二级缓存产品,hiberate3开发手册都有相头说明。配置方法都类似);

4.Hibernate3的二级缓存默认是开起的,也可以指定开起。

11,Query的list和iterator方法的不同。

list不会使用缓存,而iterate会先取数据库select id出来,然后一个id一个id的load,如果在缓存里面有,就从缓存取,没有的话就去数据库load。

不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的,list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存

查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。

这里还有一个很容易被忽视的重要问题,即打开查询缓存以后,即使是list方法也可能遇到1+N的问题!


【hibernate面试题汇总】相关文章:

网页制作面试题10-28

最新财务面试题目09-01

评论:[面试]曝外企趣味面试题07-01

8个经典面试题回答思路技巧10-02

网页制作常见的面试题(怎样兼容IE6/IE7/火狐浏览器)06-30

求职问题汇总07-01

历史词语汇总12-22

青春励志说说汇总10-19

核心词汇总结08-27

2022除夕文案汇总02-14