您的位置:首页 > 职场人生

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 

生命周期。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: