码迷,mamicode.com
首页 > Web开发 > 详细

hibernate 常见的问题

时间:2015-12-20 00:42:24      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

1. orm 指的是什么?  请谈谈你对它的看法.
 对象-关系映射,就像一面镜子一样  实现程序到数据库的自动化映射。其中面向对象的开发方法已然成为了当今企业级应用
  开发环境中的主流开发方法。关系数据库是企业级应用环境中永久存放数据库的主流数据存储系统。
 所以对象-关系映射系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。


2. 使用hibernate的时候,有哪些常见的对象。
 (1)、我们发现hibernate在执行操作的时候  打印过多的信息 。为了解决这个问题,我们将Log4j配置在项目中,然后调整打印
  级别。  步骤:1、添加log4j.jar到项目类库中  2、将log4j.properties  拷贝到src目录下  并调整打印级别
    (debug,info,warn,error)
 (2)、hibernate执行对数据的操作时,和jdbc相比:jdbc是自动提交  autocommit。hibernate缺省 false.因此,我们必须很
  明确的开始事务才行。
 (3)、hibernate 核心  API  :Configuration, SessionFactory, Session, Transaction
 

3. session中对象的三种状态是什么,,它们之间又是如何转换的,谈谈对三种状态的区别。
 对象的三种状态:(1)瞬时/临时态  ( 跟session没有建立任何关系 ) 
   (2)持久态 (和session对象相关,以map形式存入到session中)
   (3)托管/游离态 (和session对象无关,就是将session对象close掉)
 补充重点--1--:1、在commit时  保证所有的持久态对象和数据库记录保持一致。
         2、持久态对象 保存在session中  缓存起来 。多次查询直接从缓存中读取,提高了查询的效率。
  
 补充重点--2--:持久化对象,测试get和load方法。
   get方法:先在session缓存(一级缓存)中查找,若无,再在sessionfacotory(二级缓存)中查找,若无
    再去数据库中查找,还没有,返回null
   load方法:一般用于我们可以保证这个记录一定存在的情况,该方法有懒加载。

4. 主键的生成方式有几种,各自的用处?
 * native(很常用) :对于Oracle采用Sequence方式,对于Mysql和sqlServer采用identity(自增主键生成方式),native就是
  将主键的生成工作交由数据库来完成,会根据底层数据库的能力,从identity  sequence  Hilozhong 选择一个
  灵活性跟高。
 *assigned(很常用): 在插入数据的时候  主键由用户自己添加,hibernate不管
 *sequence :Oracle很常用
 *identity:使用MySQL 和 SqlServer 很常用。不能用于Oracle中
 *hilo
 *uuid :使用一个128-bit的UUID算法生成字符串类型的标识符。UUID被编码成一个32位16进制数字的字符串。
 
 UUID 经常用来生成主键值完全唯一的情况,即全局唯一标识。

5. 谈谈你对懒加载的理解
 程序调用的时候再加载,当我们需要访问数据量过大时,内存容量有限。我们就让数据在我们需要的时候再进行加载
 减少了资源内存的消耗。

6. session的get和load方法区别,  list和iterate的区别
 get和load共同点:先从一级缓存(session) 、二级缓存(SessionFactory)中找,如果都没有采取数据库中查找
 get和load区别:get方法没有懒加载的问题,如果id对应的记录不存在,则返回null
         load方法有懒加载的问题,如果id对应记录不存在 ,则抛出异常
 *iterate 可以使用二级缓存(SessionFactory)   .先去数据库中查询所需要的id ,然后再在二级缓存中查有没有该id对应的对象。如果有,直接取出
  如果没有,再去数据库中查找。iterate的使用,如果结果没有在二级缓存当中,反而多查了一条sql语句,降低了性能

 *list默认会往二级缓存中存放数据,即通过list查出的结果会放入二级缓存中,但是list本身查询时不会使用二级缓存。
 

7. 谈谈你对annotation的理解  
 注解是配置文件,它把xml配置文件的内容在代码里进行体现,避免了开发过程中多个文件/环境的切换。
 jdk5之后支持注解方法   
 注解相比较环境配置更为抽象。
 *注解不是代码 不会被执行  对代码说明能力,结合反射机制会为我们做很多事
 *注解的使用,使我们不再像以前一样频繁的写XML配置(映射)文件,一定程度上提高了开发的效率
 步骤:1、将hibernate相关的jar包引入
       2、将注解的3个jar包引入:hibernate-annotations.jar  ejb3-persistence.jar   hibernate-Commons-annotations.jar

 

9. hibernate如何分页, 请写在纸上

 举例:String hql = "from Emp";
 Query query = session.createQuery(hql);
 query.setFirstResult(0);//从第几条开始取数据
 query.setMaxResult(10);//设置每页最多显示的记录的个数


10.  hibernate条件查询,criteria,你有没有用过呢?一般用那些方法?
 Criteria API是在java语言内的接口,直接操作底层对象,写出查询代码没有通用性。性能最大优化时使用。 条件过滤的查询
 不常用,举例:Criteria c = session.createCriteria(Emp.class);//结合反射
        c.add(Restrictions.idEq(1));
        List list = c.list();
 
11. 一级缓存是什么,  谈谈你对它的理解
 一级缓存就是:session缓存。我们知道session作为作用域  相当于一次会话。
 理解:session的生命周期很短,存在于session内部的第一级最快缓存的生命周期当然也很短,所以第一级缓存的命中率(利用率)也很低
  其对系统的性能的改善(--重复利用率低--)也是很有限的,session内部缓存存在的主要作用是保持session内部数据状态的同步
 管理:应用程序调用session() 的save(),update(),saveOrUpdate(),get(),load()  以及调用查询接口的list(),iterator()时
  如果session缓存中还不存在相应的对象,hibernate就会把该对象加入到第一级的缓存当中。、
  可以通过close/clear/evict清空缓存。
  evict:清除一个对象
  clear:清除所有的对象

12. 二级缓存是什么,如何配置,谈谈你对它的理解
 SessionFactory
 配置:true
       org.hibernate.cache.EhCacheProvider
 使用:java代码中我们需要在类前面进行定义,同时方法的前面,属性的前面。类的前面加@cache,就将该类的对象引入到二级缓存当中。
 *当有些内容  经常被访问  改动不频繁  数量有限时  就讲这些内容放入到缓存当中。
 *get和load也会使用二级缓存。

13. 在使用hibernate时候,,那些情况下会碰到1+N问题,,如何解决呢?
    * 在一对多/多对一中,经常会遇到1+N问题:在1方中,查找到了n个对象,那么又需要将n个对象关联的集合取出,于是本来的一条sql查询变成了n+1条
 解决方法:
  1)扩大session的生命周期
 过滤器中:
 public void doFilter(ServletRequest servletrequest,
   ServletResponse servletresponse, FilterChain filterchain)
   throws IOException, ServletException {
   Session session = HbiUtil.getSession();
   filterchain.doFilter(servletrequest, servletresponse);
   HbiUtil.closeSession(session);
   HbiUtil.threadLocal.remove();
 }
 ------------------------------------------------------------------------------------------
 ThreadLocal并非是一个线程的本地实现版本,并不是一个Thread  ,而是线程局部变量。
 线程局部变量的应用非常简单:就是为每个使用某变量的线程提供一个该变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本进行冲突。
 public class HbiUtil {
  public static ThreadLocal threadLocal = new ThreadLocal();

  public static Session getSession(){
 //  return factory.openSession();
   
   //为了解决N+1的问题 
   Session session = threadLocal.get();
    if(session==null){
     session = factory.openSession();
     threadLocal.set(session);
    }
   return session;
  
  }
 
 }
   
  2)懒加载(延时加载,延迟加载)

14. hibernate的cascade属性是设置什么的,  在什么情况下,应该设置什么值。
      cascade属性 :(级联操作),就是我们再操作一个对象的时候,同时该对象相关联的属性也进行同样的操作。
      操作一个对象时将该对象相关联的属性也进行同样的操作。
 
15. hibernate的inverse属性的作用是什么,设置的时候,应该注意什么。
 inverse:set后面加上:inverse="true"  修改一方对另一方不会丢失关系 
 使用时应该注意  :inverse设置在哪一方  另一方则为宿主的关系。

16, 数据为什么要缓存呢, 缓存有什么好处,什么数据应该缓存呢
 *一般情况下开始开发并不适用缓存机制
 *根据需求如果不能够满足性能要求,才增加缓存,(1):二级缓存,缓存数据内容变化频率不高的内容.(2)查询缓存
 *很多系统经常在应用层增加缓存
 *如果一些数据经常需要取出来使用,我们就要增加缓存机制  这样以来就可以提高程序运行的效率。
 

17. oscache你了解吗? 如何实现view层缓存呢,  有什么好处?
 oscache是一个j2EE缓存框架,oscache能够用于任何java应用程序的普通缓存解决方案
 提供了在现有jsp页面之内实现快速内存缓冲的功能。
 
18. 事务是什么?谈谈你对他的理解
  事物是访问数据库的一个操作序列,数据库应用系统通过事物集来完成对数据库的存取。事物的正确执行使得数据库从一种
 状态转换成另一种状态。
 事物的基本概念:为了保证数据的完整性,一组要么同时执行,要么同时不执行的sql语句。
 具有的几个特点:*原子性:一个事物内的所有操作是一个整体,要么全部成功,要么全部丢失(相当于我们的转账事例,就是存钱和取钱作为一个整体进行)

   *一致性:一个事物的内部有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态
     
   *隔离性:事物查看数据时数据所处的状态,要么是另一并发事物修改它之前的状态
     要么是另一事物修改它之后的状态,事物不会查看中间状态的数据。
  
   *持久性:事物完成之后,它对系统的影响是永久性的。 
 

19. hibernate中事务隔离机制有那几个级别,分别解决了那些问题,会出现那些问题
 当数据库系统采用read Commited 隔离级别时,会导致不可重复读和第二类丢失更新的并发问题,可以在应用程序中采用
 乐观锁和悲观锁来解决问题。
 
 *读取未提交:这是最低的事物隔离级别,读事物不会阻塞读事物和写事物,写事物也不会阻塞读事物,但是会阻塞写事物。写事物不阻塞读事物,可以读取未提交的数据
  容易造成脏读。
 *读取已提交:
  解决方案:锁住已经查询出来的记录,不让其他事物进行写操作
 *可重复读:读事物不阻塞读事物,可能会造成幻读问题。解决方案:锁表
 *序列化:性能极低,一般不用。

20. 乐观锁和悲观锁, 什么区别,谈谈你对他们的理解
 乐观锁:每次提交一个事物更新时,我们想看看要修改的东西从上次读取以后有没有被其他事物修改过,如果修改过,那么更新就会失败。
 悲观锁:每次一个事物读取某一条记录后,就会把这条记录锁住,这样其他的事物要想更新,必须等以前的事物提交或者回滚解除锁。

21. hibernate一般的开发方法是什么,,从po开始呢,,还是从数据库表开始呢,各自有什么优缺点。
 1) 从domain objectmappingdb.(官方推荐的)
 2) 从数据库开始,用工具生成mapping 和domain object(实际开发中使用较多)

22. hibernate有什么优点缺点, 什么项目适合使用,  用hibernate的时候你碰些什么问题,开发方面,程序方面都可以说说,应该注意些什么。
 当我们访问数据量巨大时,同时对性能的要求也更高,hibernate 由于在orm映射中对系统资源消耗比较高,所以不适合处理数据量大的。
 适合处理逻辑复杂  数据量不大时。
 优点:hibernate实现了对jdbc的封装  使我们在进行开发的时候更加的方便。
 缺点:由于封装的过死 ,在关系的维护上 需要我们进行手动的维护  比如设置inverse   cascade属性等
 
 使用hibernate过程中遇到的问题:在映射文件中的name设定的值  如果和 po中的字段不匹配时 没法生成表

hibernate 常见的问题

标签:

原文地址:http://www.cnblogs.com/yinquanzhe/p/5060017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!