JAVA企业面试题精选 Hibernate 1-10

4.Hibernate

4.1.Hibernate有什么缺点?

参考答案:

  1.HQL最终还是要转换为JDBC,效率降低;
  2.使用数据库特性的语句,将很难调优.Hibernate对JDBC封装的国语厉害,所以就失去了对SQL的控制;
  3.不适合系统中复杂的关联查询,包括多表,复杂查询,大量数据的查询处理都不好;
  4.数据量大时,缓存机制不好使,效率明显降低;
  5.对于大批量数据的修改,删除,不适合用Hibernate,这也是ORM框架的弱点;
  6.对象化限制我们的查询.例如,一个持久性类不能映射到多个表;
  7.Hibernate带来方便的同事,也使得程序错误排查变得非常困难;
  8.Hibernate是完善的ORM框架,要想Hibernate工作好,数据库设计必须好.数据库结构的变更,需要修改hbm和bean,Hibernate自适应能力为0;
  9.setter方法的参数需要自己转换类型.

4.2.如何优化Hibernate?

参考答案:

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

4.3.Hibernate的原理及为什么要用它?

参考答案:

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


  为什么要用Hibernate;
  1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;
  2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作;
  3.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性;
  4.Hibernate的性能非常好,因为他是个轻量级框架.映射的灵活性很出色.它支持各种关系数据库,从一对一到多对多的各种复杂关系.

4.4.Hibernate是如何延迟加载?

参考答案:

  1.Hibernate2延迟加载实现:a)实体对象 b)集合(Collection);
  2.Hibernate3提供了属性的延迟加载功能;
  当Hibernate在查询数据的时候,数据并没有存放在内存中,当程序真正对数据操作时,对象才存放在内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能.

4.5.Hibernate的核心配置文件是什么及其作用?

参考答案:

  Hibernate的核心配置文件是hibernate.cfg.xml,主要用于配置数据库连接和Hibernate运行时所需的各种参数.

4.6.说出几个与Spring同类型的开源框架,说出几个与Hibernate同类型的开源框架,说出几个与Struts同类型的开源框架

参考答案:

  1.与Spring同类型的开源框架:EJB3.0,picoContainer;
  2.与Hibernate同类型的开源框架:MyBatis,JDO,JPA;
  3.与Struts同类型的开源框架:WebWork,tapestry,JSF.

4.7.简述Hibernate与JDBC相比的优缺点

参考答案:

  Hibernate与JDBC相比较的主要优点为:
  1.面向对象
  Hibernate可以让开发人员以面向对象的思想来操作数据库.JDBC只能通过SQL语句将元数据传送给数据库,进行数据操作.而Hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可.
  2.移植性
  Hibernate使用XML或JPA的配置以及数据库方言等等机制,使得Hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异.而直接使用JDBC就不得不考虑数据库差异的问题.
  3.封装性
  Hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需要写大量的SQL语句,这就极大的提高了开发者的开发效率.
  4.缓存机制
  Hibernate提供了缓存机制(Session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益.


  Hibernate与JDBC相比较的主要缺点为:
  1.对Hibernate而言,它对JDBC封装过于厉害,所以就失去了对SQL的控制(当然Hibernate也可以使用native sql即使用createSQLQuery等方法来调用与数据库相关的sql,但这样一来也就影响了Hibernate的可移植性),使得Hibernate在很多地方不够灵活,难于优化,尤其对于一些复杂的关联查询时,Hibernate提供的功能远不及直接使用JDBC方便性能更高.
  2.Hibernate没有提供专门的批处理机制,如果要批量更新或插入数据时,还需要显示的flush,clear之类的操作,性能不如JDBC.
  3.相对于JDBC,Hibernate更消耗内存,因为它每次的数据库操作都要做数据和对象的转换/封装,查询出一条数据就要创建一个或多个对象,这样太消耗内存了.
  4.Hibernate提供了很多好处,但这些好处本身就是陷阱(如proxy陷阱等),开发者如果不注意就会掉入陷阱而不知,这样就可能会出现一些无法排查的异常情况,比如程序表面上看着毫无错误,可就是达不到预期的效果,而且并无异常抛出,断点排查也不一定能找到症结所在,这将是非常令人抓狂的一件事!

4.8.请列举Hibernate的主键生成方式

参考答案:

  1.sequence是采用序列方式生成主键,适用于Oracle数据库.
  2.identity是采用数据库自增长机制生成主键,适用于Oracle之外的其他数据库.
  3.native是根据当前配置的数据库方言,自动选择sequence或者identity.
  4.increment不是采用数据库自身的机制来生成主键,而是Hibernate提供的一种生成主键的方式.它会获取当前表中主键的最大值,然后加1作为新的主键.这种方式在并发量高时存在问题,可能会生成重复的主键,因此不推荐使用.
  5.assigned是Hibernate不负责生成主键,需要程序员自己处理主键的生成.
  6.uuid/hilo是采用uuid或hilo算法生成一个主键值,这个主键值是一个不规则的长数字.这种方式生成的主键可以保证不重复,但是没有规律,因此不能按主键排序.

4.9.Hibernate中inverse属性及其含义

参考答案:

  inverser是指的关联关系的控制方向,inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系.

4.10.对Hibernate的延迟加载如何理解,在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

参考答案:

  延迟加载是指在使用某些Hibernate方法查询数据时,Hibernate返回的只是一个空对象(除id外属性都为null),并没有真正查询数据库.而在使用这个对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中.这种将查询时机推迟到对象访问时的机制称之为延迟加载.
  采用具有延迟加载机制的操作,需要避免Session提前关系,避免在使用对象之前关闭Session.可以采用以下2种方案解决此问题:
  1)采用非延迟加载的查询方法,如query.get(),session.list()等.
  2)在使用对象之后再关闭session.
  在项目中,DAO只是负责查询出数据,而使用数据的时机是在JSP解析的过程中,因此需要避免在DAO中关闭session,或者书偶要在视图层保持session的开启.项目中解决这个问题的手段称之为Open session in view,即在视图层保持session的开启.在不同技术框架下,实现Open session in view的手段不同:
  1)在Servlet中使用过滤器实现.
  2)在Struts2中使用拦截器实现.
  3)在Spring中使用AOP实现.

4.Hibernate

4.1.Hibernate有什么缺点?

参考答案:

  1.HQL最终还是要转换为JDBC,效率降低;
  2.使用数据库特性的语句,将很难调优.Hibernate对JDBC封装的国语厉害,所以就失去了对SQL的控制;
  3.不适合系统中复杂的关联查询,包括多表,复杂查询,大量数据的查询处理都不好;
  4.数据量大时,缓存机制不好使,效率明显降低;
  5.对于大批量数据的修改,删除,不适合用Hibernate,这也是ORM框架的弱点;
  6.对象化限制我们的查询.例如,一个持久性类不能映射到多个表;
  7.Hibernate带来方便的同事,也使得程序错误排查变得非常困难;
  8.Hibernate是完善的ORM框架,要想Hibernate工作好,数据库设计必须好.数据库结构的变更,需要修改hbm和bean,Hibernate自适应能力为0;
  9.setter方法的参数需要自己转换类型.

4.2.如何优化Hibernate?

参考答案:

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

4.3.Hibernate的原理及为什么要用它?

参考答案:

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


  为什么要用Hibernate;
  1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;
  2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO层的编码工作;
  3.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性;
  4.Hibernate的性能非常好,因为他是个轻量级框架.映射的灵活性很出色.它支持各种关系数据库,从一对一到多对多的各种复杂关系.

4.4.Hibernate是如何延迟加载?

参考答案:

  1.Hibernate2延迟加载实现:a)实体对象 b)集合(Collection);
  2.Hibernate3提供了属性的延迟加载功能;
  当Hibernate在查询数据的时候,数据并没有存放在内存中,当程序真正对数据操作时,对象才存放在内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能.

4.5.Hibernate的核心配置文件是什么及其作用?

参考答案:

  Hibernate的核心配置文件是hibernate.cfg.xml,主要用于配置数据库连接和Hibernate运行时所需的各种参数.

4.6.说出几个与Spring同类型的开源框架,说出几个与Hibernate同类型的开源框架,说出几个与Struts同类型的开源框架

参考答案:

  1.与Spring同类型的开源框架:EJB3.0,picoContainer;
  2.与Hibernate同类型的开源框架:MyBatis,JDO,JPA;
  3.与Struts同类型的开源框架:WebWork,tapestry,JSF.

4.7.简述Hibernate与JDBC相比的优缺点

参考答案:

  Hibernate与JDBC相比较的主要优点为:
  1.面向对象
  Hibernate可以让开发人员以面向对象的思想来操作数据库.JDBC只能通过SQL语句将元数据传送给数据库,进行数据操作.而Hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可.
  2.移植性
  Hibernate使用XML或JPA的配置以及数据库方言等等机制,使得Hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异.而直接使用JDBC就不得不考虑数据库差异的问题.
  3.封装性
  Hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需要写大量的SQL语句,这就极大的提高了开发者的开发效率.
  4.缓存机制
  Hibernate提供了缓存机制(Session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益.


  Hibernate与JDBC相比较的主要缺点为:
  1.对Hibernate而言,它对JDBC封装过于厉害,所以就失去了对SQL的控制(当然Hibernate也可以使用native sql即使用createSQLQuery等方法来调用与数据库相关的sql,但这样一来也就影响了Hibernate的可移植性),使得Hibernate在很多地方不够灵活,难于优化,尤其对于一些复杂的关联查询时,Hibernate提供的功能远不及直接使用JDBC方便性能更高.
  2.Hibernate没有提供专门的批处理机制,如果要批量更新或插入数据时,还需要显示的flush,clear之类的操作,性能不如JDBC.
  3.相对于JDBC,Hibernate更消耗内存,因为它每次的数据库操作都要做数据和对象的转换/封装,查询出一条数据就要创建一个或多个对象,这样太消耗内存了.
  4.Hibernate提供了很多好处,但这些好处本身就是陷阱(如proxy陷阱等),开发者如果不注意就会掉入陷阱而不知,这样就可能会出现一些无法排查的异常情况,比如程序表面上看着毫无错误,可就是达不到预期的效果,而且并无异常抛出,断点排查也不一定能找到症结所在,这将是非常令人抓狂的一件事!

4.8.请列举Hibernate的主键生成方式

参考答案:

  1.sequence是采用序列方式生成主键,适用于Oracle数据库.
  2.identity是采用数据库自增长机制生成主键,适用于Oracle之外的其他数据库.
  3.native是根据当前配置的数据库方言,自动选择sequence或者identity.
  4.increment不是采用数据库自身的机制来生成主键,而是Hibernate提供的一种生成主键的方式.它会获取当前表中主键的最大值,然后加1作为新的主键.这种方式在并发量高时存在问题,可能会生成重复的主键,因此不推荐使用.
  5.assigned是Hibernate不负责生成主键,需要程序员自己处理主键的生成.
  6.uuid/hilo是采用uuid或hilo算法生成一个主键值,这个主键值是一个不规则的长数字.这种方式生成的主键可以保证不重复,但是没有规律,因此不能按主键排序.

4.9.Hibernate中inverse属性及其含义

参考答案:

  inverser是指的关联关系的控制方向,inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系.

4.10.对Hibernate的延迟加载如何理解,在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

参考答案:

  延迟加载是指在使用某些Hibernate方法查询数据时,Hibernate返回的只是一个空对象(除id外属性都为null),并没有真正查询数据库.而在使用这个对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中.这种将查询时机推迟到对象访问时的机制称之为延迟加载.
  采用具有延迟加载机制的操作,需要避免Session提前关系,避免在使用对象之前关闭Session.可以采用以下2种方案解决此问题:
  1)采用非延迟加载的查询方法,如query.get(),session.list()等.
  2)在使用对象之后再关闭session.
  在项目中,DAO只是负责查询出数据,而使用数据的时机是在JSP解析的过程中,因此需要避免在DAO中关闭session,或者书偶要在视图层保持session的开启.项目中解决这个问题的手段称之为Open session in view,即在视图层保持session的开启.在不同技术框架下,实现Open session in view的手段不同:
  1)在Servlet中使用过滤器实现.
  2)在Struts2中使用拦截器实现.
  3)在Spring中使用AOP实现.

猜你喜欢

转载自blog.csdn.net/a639735331/article/details/81699675
今日推荐