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实现.