java面试题1
2016-02-28 20:42
316 查看
1、Hibernate
实现中,load 和 get 方法的区别,find 和 iterate 的区别?
答:load 和 get 方法的区别:hibernate 对于 load 方法认为该数据在数据库中
一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate 一定要获取到真实的数据,否则返回null。
find 和 iterate 的区别:find 方法通过一条 Select SQL 实现了查询操作,
而 iterate 方法要执行多条 Select SQL.iterate 第一次查询获取所有符合条件
的记录的 id,然后再根据各个 id 从库表中读取对应的记录,这是一个典型的 N+1次的查询问题,如果符合条件记录有 10000 条,就需要执行 10001 条 Select SQL,性能会非常差。
2、介绍一下 hibernate 的工作原理、优点以及如何优化?
答:
工作原理:
启动 Hibernate 构建 Configuration 实例,初始化该实例中的所有变量
Configuration cfg = new Configuration().configure();
b.加载 hibernate.cfg.xml 文件至该实例内存,通过 hibernate.xfg.xml 文件中
的mapping 节点配置,加载 hbm.xml 文件至该实例内存;
c. 由 上 面 得 到 的 Configuration 实 例 构 建 一 个 SessionFactory 实 例
SessionFactory sf = cfg.buildSessionFactory();
d.由上面得到的SessionFactory 实例创建连接 Session s = sf.openSession();
e.由上面得到的 Session 实例创建事务操作接口 Transaction 的一个实例 tx
Transaction tx = s.beginTransaction();
f.通过 Session 接口提供的各种方法操作数据库的访问
g.提交数据库的操作结果 tx.commit();
h.关闭 Session 链接 s.close();
优点:
a.对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
b.Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度的简化 DAO 层的编码工作
c.hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。
d.hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它
支持各种关系数据库,从一对一到多对多的各种复杂关系。
优化:
a.使用双向一对多关联,不使用单向一对多
b.灵活使用单向一对多关联
c.不用一对一,用多对一取代
3、对
hibernate 的延迟加载如何理解,在实际应用中,延迟加载与 session
关闭的矛盾是如何处理的?
答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。那么 Hibernate 是怎么知识用户在什么时候使用数据了呢?又是如何加载数据呢?其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用
getter 方法时就会去数据库加载数据。但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。 这种情况就叫做未初始化的关系。
延迟加载与 session 关闭的矛盾一般可以这样处理:
1)、关闭延迟加载特性。
操作起来比较简单,因为hibernate 的延迟加载特性是在hbm配置里面可控制的。 默认 lazy="true",具体配置可以查看一下相关文档,就不详细叙述了。
但使用这个解决办法带来的隐患是十分大的。
首先,出现 no session or session was closed 就证明了您已经在使用外键关
联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。
2)、在 session 关闭之前把我们想要查询的数据先获取了。
首先需要了解一下 session 什么时候关闭,也就是它的生命周期。通常情况下
hibernate 会在查询数据关闭 session,而使用 getHibernateTemplate().get
方法查询后会延迟关闭的时间。会在事务结束后才关闭。
使用拦截器 (Interceptor)或过滤器(Filter)控制 session。
spring 为解决 hibernate 这一特性提供的解决方案,可以有效的控制 session
生命周期。
实现中,load 和 get 方法的区别,find 和 iterate 的区别?
答:load 和 get 方法的区别:hibernate 对于 load 方法认为该数据在数据库中
一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate 一定要获取到真实的数据,否则返回null。
find 和 iterate 的区别:find 方法通过一条 Select SQL 实现了查询操作,
而 iterate 方法要执行多条 Select SQL.iterate 第一次查询获取所有符合条件
的记录的 id,然后再根据各个 id 从库表中读取对应的记录,这是一个典型的 N+1次的查询问题,如果符合条件记录有 10000 条,就需要执行 10001 条 Select SQL,性能会非常差。
2、介绍一下 hibernate 的工作原理、优点以及如何优化?
答:
工作原理:
启动 Hibernate 构建 Configuration 实例,初始化该实例中的所有变量
Configuration cfg = new Configuration().configure();
b.加载 hibernate.cfg.xml 文件至该实例内存,通过 hibernate.xfg.xml 文件中
的mapping 节点配置,加载 hbm.xml 文件至该实例内存;
c. 由 上 面 得 到 的 Configuration 实 例 构 建 一 个 SessionFactory 实 例
SessionFactory sf = cfg.buildSessionFactory();
d.由上面得到的SessionFactory 实例创建连接 Session s = sf.openSession();
e.由上面得到的 Session 实例创建事务操作接口 Transaction 的一个实例 tx
Transaction tx = s.beginTransaction();
f.通过 Session 接口提供的各种方法操作数据库的访问
g.提交数据库的操作结果 tx.commit();
h.关闭 Session 链接 s.close();
优点:
a.对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
b.Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度的简化 DAO 层的编码工作
c.hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。
d.hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它
支持各种关系数据库,从一对一到多对多的各种复杂关系。
优化:
a.使用双向一对多关联,不使用单向一对多
b.灵活使用单向一对多关联
c.不用一对一,用多对一取代
3、对
hibernate 的延迟加载如何理解,在实际应用中,延迟加载与 session
关闭的矛盾是如何处理的?
答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。那么 Hibernate 是怎么知识用户在什么时候使用数据了呢?又是如何加载数据呢?其实很简单,它使用了代理机制。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用
getter 方法时就会去数据库加载数据。但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。 这种情况就叫做未初始化的关系。
延迟加载与 session 关闭的矛盾一般可以这样处理:
1)、关闭延迟加载特性。
操作起来比较简单,因为hibernate 的延迟加载特性是在hbm配置里面可控制的。 默认 lazy="true",具体配置可以查看一下相关文档,就不详细叙述了。
但使用这个解决办法带来的隐患是十分大的。
首先,出现 no session or session was closed 就证明了您已经在使用外键关
联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。
2)、在 session 关闭之前把我们想要查询的数据先获取了。
首先需要了解一下 session 什么时候关闭,也就是它的生命周期。通常情况下
hibernate 会在查询数据关闭 session,而使用 getHibernateTemplate().get
方法查询后会延迟关闭的时间。会在事务结束后才关闭。
使用拦截器 (Interceptor)或过滤器(Filter)控制 session。
spring 为解决 hibernate 这一特性提供的解决方案,可以有效的控制 session
生命周期。
相关文章推荐
- JVM工作原理和特点(一些二逼的逼神面试官会问的问题)
- 程序员这样优化简历,一投制胜
- 一个测试老鸟对职业技术交流群的几点看法
- 程序的链接、装载和库——《程序员的自我修养》笔记
- IT人士的职业规范——凝视
- 统计思维:程序员数学之概率统计(第2版):第1章 探索性数据分析
- 微软面试题之两个链表的第一个公共结点
- java面试题
- 面试题目——快速排序
- Java线程面试题 Top 50 (转载)
- leetcode之 Sum Root to Leaf Numbers
- leetcode之Remove Duplicates from Sorted Array II
- leetcode之Super ugly number
- 面试中经常会问道的软件工程的知识
- java面试题_SQL_取某年的各个月份的发邮件数
- 轩辕互动面试题两道比较复杂的
- 程序员初学机器学习的四种方式
- 面试求职之经验
- IT求职准备之书籍网站经验
- 面试准备之排序算法