Hibernate: 面试题

 Hibernate:

             1.请你谈谈你对OR映射的理解?

                 re:将每个实体类都映射为数据库中的一个表,或将数据库中的表映射为一个实体类。

           

             2.很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?

                re:因为Hibernate属于大型框架,里面对方法的封装比较多,让SQL控制权降低。这样的话,适用性就会降低,在不必要的操作上会浪费时间。但是只要将Hibernate里的配置进行优化,也能提高其性能。(关于hibernate的具体优化请见下回分解吧。)

   

             3.Hibernate为什么一定要定义一个数据库标识?

                re:可以让映射文件变得简洁,消除无用的噪音(比如TBL_前缀等)。Hibernate使用的默认策略是几乎什么都不做,所以使用标识的作用就是使数据操作更加简洁和方便.

             

             4.为什么Hibernate建议你的实体类实现hashCode和equals方法?

               re:因为Hibernate使用了一级和二级缓存,很多查询为了提高效率Hibernate都会先从缓存中进行查找,然后再从数据库进行查找。而HashCode是唯一的,所以这样避免数据操作出现数据混淆的可能,而equals的作用是对比Hibernate缓存中数据是否一致。

 

             5.谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?

               re:数据库标识是为了方便和简洁映射文件,而主键是为了使数据不会重复。

 

              6.谈谈你对Hibernate关联映射与数据库外键之间关系的认识?

               re:Hibernate在进行映射的时候会将数据库的关系也进行映射将数据库中的外键也使用标签的形式进行管理,这样在人为操作的时候就不需要手动的管理数据库关系了。 

              7.调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解

               re:

                不会,具体执行步骤如下:

                                  No1. 首先在Session内部缓存中进行查找,如果发现则直接返回。

                                  No2. 执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。

                                  No3. 根据unsaved-value判断对象是否处于未保存状态。

                                  No4. 如果对象未保存(Transient状态),则调用save方法保存对象。

                                  No5. 如果对象未已保存(Detached状态),则调用update方法将对象与Session重新关联。

             

              8.调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解

               re:

                   不会,具体步骤同上。

             

               6.请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size

                re:

        lazy懒加载,hibernate映射文件默认的lazy = true.lazy=“extra”extra属性是不大容易重视的,其实它和true差不多,但有个小的智能的地方是,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据

    inverse控制翻转,主要是为了让谁去维护关系,一般是在主表中配置,将维护关系的只能交给主键。

    fetch取值,fetch="join"主要是在查询的时候Hibernate会自动查询有关联的表。fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合,此时lazy会失效.(也可以通过设置lazy为false,实现加载关联表)

    fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

    batch-size配置这个属性是让Hibernate在执行批量的数据库操作

 

              7.配置了lazy=”true”一定会实现懒加载吗?

                 re:

                     不一定,因为如果再配置中你也使用fetch属性的话此时lazy就会失效。(lazy设为true,同理)

 

              8.请你谈谈Hibernate中的“N+1”问题

               re:

                    所谓N+1问题,即hibernate在做关联查询的时候有几个关联对象,就会有多少个查询语句,这便是N,而+1是查询实体本生还需要一个查询语句,所以hibernate查询一个有关联的实体便会产生N+1条查询语句,这便是N+1.对于hibernate的N+1问题。而Hibernate中使用N+1策略时执行Criteria时,会将自动进行SQL构造,并且映射到实体Bean中,就只会返回一个结果,这样不仅提高了性能,而且在处理返回值的时候也变得比较轻松。

 

             9.请你谈谈Hibernate有哪些最佳实践?

                re:

                    就目前本人没有用过太多的框架,就不和其他框架做比较。在此就简单说一下心得吧。

                    No1.对象-关系映射。

                       hibernate支持关系型数据库,并且它与sql紧密结合的程度较高,有自己的查询语言hql,它与sql的区别在于hql是面向对象的而不是针对数据模型。但是如果需要也可以在hibernate中使用 sql.并且hibernate还提供了灵活的映射机制,以及session级缓存,和sessionfactosy级缓存。只是session级缓存是非线程安全的,如果多线程访问可能引起数据存取的不一致,甚至系统宕机。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值