Hibernate面试题

上传人:jiups****uk12 文档编号:39460428 上传时间:2018-05-16 格式:DOC 页数:17 大小:83.50KB
返回 下载 相关 举报
Hibernate面试题_第1页
第1页 / 共17页
Hibernate面试题_第2页
第2页 / 共17页
Hibernate面试题_第3页
第3页 / 共17页
Hibernate面试题_第4页
第4页 / 共17页
Hibernate面试题_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Hibernate面试题》由会员分享,可在线阅读,更多相关《Hibernate面试题(17页珍藏版)》请在金锄头文库上搜索。

1、1. Hibernate 工作原理及为什么要用?工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建 SessionFactory 3.打开 Session 4.创建事务 Transation 5.持久化操作 6.提交事务 7.关闭 Session 8.关闭 SesstionFactory 为什么要用: 1). 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2). Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度 的简化 DAO 层的编码工作 3). hibernate 使用 J

2、ava 反射机制,而不是字节码增强程序来实现透明性。 4). hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关 系数据库,从一对一到多对多的各种复杂关系。 2 Hibernate 是如何延迟加载是如何延迟加载? 1). Hibernate2 延迟加载实现:a)实体对象 b)集合(Collection) 2). Hibernate3 提供了属性的延迟加载功能 当 Hibernate 在查询数据的时候,数据并没有存 在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他 节省了服务器的内存开销,从而提高了服务器的性能。 3Hibern

3、ate 中怎样实现类之间的关系中怎样实现类之间的关系?(如:一对多、多对多的关系如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我 们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to- many、many-to-many 4. Hibernate 中的中的 update()和和 saveOrUpdate()的区别的区别. 摘自 hibernate 说明文档: saveOrUpdate()做下面的事: 如果对象已经在本 session 中持久化了,不做任何事 如果另一个与本 session 关联的

4、对象拥有相同的持久化标识(identifier),抛出一个异常 如果对象没有持久化标识(identifier)属性,对其调用 save() 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用 save() 如果对象是附带版本信息的(通过 或 ) 并且版本属性的值表明其 是一个新实例化的对象,save()它。 否则 update() 这个对象5. Hibernate 有哪几种查询数据的方式有哪几种查询数据的方式 hql 查询,sql 查询,条件查询 答:导航对象图检索 OID 检索 HQL 检索 QBC 检索 本地 SQL 检索6. load()和和 get()的区别

5、是什么?的区别是什么? 答:1) 他们都试图从数据库加载一个实体对象时,Session 先判断该对象是否位于缓存之中,如果 存在就直接返回位于 Session 缓存中的持久化对象,如果修改了持久化对象的属性,那么 当 Session 清理缓存时,会根据持久化对象的属性变化来同步更新数据库。2)区别:当数据库中不存在与 OID 对应的记录时,load()方法会抛出 ObjectNotFoundException 异常,而 get()方法会返回 null。 3)两者采用的延迟策略不同:默认情况下,load()方法采用延迟检索策略()(Hibernate 不会执行 select 语句,金返回实 体类

6、的代理类实例,占用内存很少);而 get()采用立即检索策略(Hibernate 会立即执行 select 语句) 4)使用场合:如果加载一个对象的目的是为了访问他的各个属性,可以 get();如果加载一个对象的目的是为了删除它,或者建立与别的对象的关联关系,可以使用 load() ;7. 谈谈谈谈 hibernate 的延迟加载和的延迟加载和 openSessionInView 延迟加载要在 session 范围内,用到的时候再加载;opensessioninview 是在 web 层写了一个 filter 来打开和关闭 session,这样就表示在一次 request 过程中 sessio

7、n 一直开着,保证了延 迟 加载在 session 中的这个前提。8. Hibernate 工作原理及为什么要用?工作原理及为什么要用? 原理: 1).读取并解析配置文件 2).读取并解析映射信息,创建 SessionFactory 3).打开 Sesssion 4).创建事务 Transation 5).持久化操作 6).提交事务 7).关闭 Session 8).关闭 SesstionFactory 为什么要用: 1). 对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2). Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM

8、实现。他很大 程度的简化 DAO 层的编码工作 3). hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。 4). hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各 种关系数据库,从一对一到多对多的各种复杂关系。9 Hibernate 是如何延迟加载是如何延迟加载? 1. Hibernate2 延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时, 对象才存在与内存中,就实现了

9、延迟加载,他节省了服务器的内存开销,从而提高了服务 器的性能。10. Hibernate 中怎样实现类之间的关系中怎样实现类之间的关系?(如:一对多、多对多的关系如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我 们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to- many、many-to-many、11. Hibernate 的查询方式的查询方式 Sql、Criteria,object comptosition Hql: 1)、 属性查询 2)、 参数查询、命名参数查询 3)、 关联查询 4

10、)、 分页查询 5)、 统计函数12. 如何优化如何优化 Hibernate? 1).使用双向一对多关联,不使用单向一对多 2).灵活使用单向一对多关联 3).不用一对一,用多对一取代 4).配置对象缓存,不使用集合缓存 5).一对多集合使用 Bag,多对多集合使用 Set 6). 继承类使用显式多态 7). 表字段要少,表关联不要怕多,有二级缓存撑腰 8). 制定合理的缓存策略 采用合理的 session 管理机制 尽量使用延迟加载 many 大文本、大文件 设定合理的批处理参数(batch-size) 如有可能,选用 uuid 作为主键生成器如有可能,选用基于 version 的乐观锁替代

11、悲观锁 开发过程中,打开 hibernate 的 SQl 日志输出(hibernate.show_sql=true),通过观察 hibernate 生成的 sql 语句进一步了解其实现原理,从而指事实上更好的实现策略。13. Hibernate 是一个开放源代码的对象关系映射框架,它对是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象进行了非常轻量级的对象 封装,使得封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客

12、户端程序实用,也可以在 Servlet/JSP 的 Web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架 构中取代 CMP,完成数据持久化的重任。 大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那 么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。 Hibernate 适时的填补 了这一空白,它为 Java 应用提供了一个易用的、高效率的对象关系映射框架。hibernate 是 个轻量级的持久性框架,功 能却非常丰富。 优点: a.Hibernate 使用 Java 反射机制而不是字节码增强程序来实现透明性。 b.

13、Hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。 c.它支持各种关系数据库,从一对一到多对多的各种复杂关系。 缺点: 它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)其独有的界面和可 怜的市场份额也让人不安,尽管如此,Hibernate 还是以其强大的发展动力减轻了这些风险。 其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。 上面回贴情绪有点激动,希望谅解,我不是因为有人批评 Hibernate 而感到不快,而是因为 帖子里面的观点实在让我觉得荒谬。不管觉得 Hibernate 好也吧,不好也吧,我唯一觉得 遗憾的是,

14、在中文论坛里面找不到一个对 Hibernate 的真正高水平的评价。在 TSS 上有一 个关于 Hibernate 的 hot thread,跟了几百贴,其中包括 Hibernate 作者 Gavin 和 LiDO JDO 的 CTO,对于 JDO 和 Hibernate 有过一些激烈的争论,我曾经耐心的看了一遍,仍然没有 发现针对 Hibernate 真正有力的攻击,那些所 谓的攻击无非针对 Hibernate 没有一个 GUI 的配置工具,没有商业公司支持,没有标准化等等这些站不住脚的理由。14. 补充几点我的意见: 一、Hibernate 是 JDBC 的轻量级的对象封装,它是一个独立的

15、对象持久层框架,和 App Server,和 EJB 没有什么必然的联系。Hibernate 可以用在任何 JDBC 可以使用的场合,例 如 Java 应用程序的数据库访问代码,DAO 接口 的实现类,甚至可以是 BMP 里面的访问 数据库的代码。从这个意义上来说,Hibernate 和 EB 不是一个范畴的东西,也不存在非此 即彼的关系。 二、Hibernate 是一个和 JDBC 密切关联的框架,所以 Hibernate 的兼容性和 JDBC 驱动,和 数据库都有一定的关系,但是和使用它的 Java 程序,和 App Server 没有任何关系,也不存 在兼容性问题。 三、Hibernat

16、e 不能用来直接和 Entity Bean 做对比,只有放在整个 J2EE 项目的框架中才能 比较。并且即使是放在软件整体框架中来看,Hibernate 也是做为 JDBC 的替代者出现的, 而 不是 Entity Bean 的替代者出现的,让我再列一次我已经列 n 次的框架结构:传统的架构: 1) Session Bean Entity Bean DB 为了解决性能障碍的替代架构: 2) Session Bean DAO JDBC DB 使用 Hibernate 来提高上面架构的开发效率的架构: 3) Session Bean DAO Hibernate DB 就上面 3 个架构来分析: 1)、内存消耗:采用 JDBC 的架构 2 无疑是最省内存的,Hibernate 的架构 3 次之,EB 的架 构最差。 2)、运行效率:如果 JDBC 的代码写的非常优化,那么 JDBC 架构运行效率最高,但是实 际项目中,这一点几乎

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号