难点为:session管理与性能优化。(性能优化是个经验活; 关于session管理,单纯的hibernate可以使用ThreadLocal来解决, 如果和spring结合,使用spring提供的session管理方案很不错。)

1.load()和get()的区别

  两者都会先在缓存中查找对象,先一级缓存,再二级缓存。当没在缓存中找到对象时,若我们使用session.load(User.class,id)方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。这个代理对象存在于一级缓存,以map的形式,此时id为map的key;get()就会离开查数据库。这样就能在某些情况下大幅度提高性能。

  若没在数据库中找到数据,get()会抛出NullPointException的异常;执行load()方法后,使用代理对象,会抛出ObjectNotFoundException异常;当我们只要看到控制台报LazyInitializationException这种异常,就知道是使用了load的方式延迟加载一个对象了(可能是得到代理对象后,还没有使用这个代理对象,即真正去查数据库,数据库就关闭了。),解决这个的方法有两种,一种是将load改成get的方式来得到该对象,另一种是在表示层来开启我们的session和关闭session。

 

2.sorted collection 和ordered collection有什么区别

  sorted collection是在内存中通过java比较器进行排序的
  ordered collection是在数据库中通过order by进行排序的

 

3.比较Hibernate的三种检索策略优缺点

  1立即检索;
优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象;
缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;
  2延迟检索:
优点:由应用程序决定需要加载哪些对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间;
缺点:应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;
  3 迫切左外连接检索
优点:1对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象。2使用了外连接,select语句数目少;
缺点:1 可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;

 

4.如何在控制台看到hibernate生成并执行的sql

  在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true
  这样生成的SQL就会在控制台出现了
  注意:这样做会加重系统的负担,不利于性能调优

 

5.hibernate都支持哪些缓存策略

  Read-only:  这种策略适用于那些频繁读取却不会更新的数据,这是目前为止最简单和最有效的缓存策略
  Read/write:这种策略适用于需要被更新的数据,比read-only更耗费资源,在非JTA环境下,每个事务需要在session.close和session.disconnect()被调用
  Nonstrict read/write: 这种策略不保障两个同时进行的事务会修改同一块数据,这种策略适用于那些经常读取但是极少更新的数据
  Transactional: 这种策略是完全事务化得缓存策略,可以用在JTA环境下

 

6.Hibernate工作原理及为什么要用

  原理:
  1.读取并解析配置文件
  2.读取并解析映射信息,创建SessionFactory
  3.打开Sesssion
  4.创建事务Transation
  5.持久化操作
  6.提交事务
  7.关闭Session
  8.关闭SesstionFactory  

  为什么要用:
  1.    对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

  2.   Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。

  3.   hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

  4.   hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

 

7.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

  类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-  to-many、many-to-many。

 

8.Hibernate的缓存机制

  1. 内部缓存存在Hibernate中又叫一级缓存session,属于应用事物级缓存。

  2. 二级缓存:
  a) 应用及缓存
  b) 分布式缓存
  条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据。

  SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和   Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓  存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的  内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一  个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓  存也被称为Hibernate的第二级缓存。

  3.第三方缓存的实现

 

9.如何优化Hibernate

  1.使用双向一对多关联,不使用单向一对多
  2.灵活使用单向一对多关联
  3.不用一对一,用多对一取代
  4.配置对象缓存,不使用集合缓存
  5.一对多集合使用Bag,多对多集合使用Set
  6. 继承类使用显式多态
  7. 表字段要少,表关联不要怕多,有二级缓存撑腰

posted on 2016-04-22 00:15  反光的小鱼儿  阅读(291)  评论(0编辑  收藏  举报