Hibernate面试总结
1,谈谈你对hibernate的理解
(1)为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。java采用jdbc来实现这个功能,但是使用jdbc完成上述功能的话需要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,而且也会产生大量的冗余代码
(2)通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即Object Relation Mapping),人们可以通过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。
(3)使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。
(4)使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。
2,谈谈hibernate的生命周期
3,hibernate优点
(1) Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。使得开发人员将更多的精力放到业务逻辑的处理上.
(2) Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
(3) hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
(4) hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系
(5)hibernate解决jdbc数据移植难度比较大,不利于后期维护和二次开发的问题
(6) hibernate解决jdbc表数据关联复杂,sql语句编写难度比较大的问题,不用自己手写表的数据关联
4,hibernate与ibatis区别
hibernate:一站式持久化框架(相对jdbc节省90%的代码)
ibatis:半持久化框架(相对jdbc节省60%的代码),sql语句放在xml文件中,ibatis读取xml文件,获取sql语句,提供find方法,完成查询,要求数据库中的字段名要和实体类中的属性名相同,如果不相同,则加入as进行修饰即可(select t_id as id......)
5,hibernate的延迟加载(懒加载)机制是如何延迟加载的,以及延迟加载的优点?怎样禁止延迟加载?
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载(底层:在加载类的时候,会生成一个动态类,这个动态类继承被加载的类,类中的get方法中的第一句就是发送sql语句执行查询操作)
优点:hibernate延迟加载节省了服务器的内存开销,从而提高了服务器的性能
如何禁止: 把实体对象使用final修饰(但在实际开发中不建议使用final来修饰实体对象,因为在很多框架中大量使用懒加载机制)
在实体映射配置文件中的class标签中设置属性<class lazy="false">
6,使用懒加载机制时应注意
get方法没有使用延迟加载,而load方法使用了延迟加载.当使用load方法对对象进行加载之后如果关闭了session之后再去通过getXxx方法取数据的话就会报异常LazyInitializationException,错误信息表示session已经关闭,那么如何解决呢?单纯使数据层的session不关闭了?这样不行,因为当多用户访问时,可能会造成服务器当机.解决方法就是数据层的session到表示层再关闭,当我们在表示层将数据取出显示后,我们从当前线程中取出对应的数据层的session,然后再将其关闭.
7,hibernate的映射关系
单向的一对多:(在一的一方配置)streets表示多方
<set name="streets">
<key column="distract_id" /> 必须添加关系键(一方的关系键)
<one-to-many class="com.tarena.entity.Street" />
</set>
单向的多对一:(在多的一方配置) distract表示一方
<many-to-one name="distract" class="com.tarena.entity.Distract" column="distract_id" />一定要添加一个外键列
插入多方需要先把一方插入后在插入多方 在多方设置cascade
cascade="" 默认:none"不使用任何级联操作delete:级联删除save-update:级联更新 all:级联删除、级联更新
建议:在开发中避免使用
双向的一对多:在一方和多方都要进行配置,一般由多方维护关系键(一方配置文件中设置inverse="true" 表示由一方的对方(多方)进行管理)
多对多:
一般两个表示多对多关系的话,一般设置一个中间表,放置两个表的主键,并且分别是两个表的外键,
对象模型中 ,分别定义一个set集合的属性,在映射文件中配置多对多关系
8,update和saveOrUpdate区别?get方法和load方法的区别?
Update和saveOrUpdate区别:
save方法就是讲对象持久化成持久化状态,将对象的状态插入数据库
saveOrUpdate方法会根据对象id的不同来选择使用save或者update,当对象的id为null的时候就执行save方法,如果对象的id从来都没有被持久化过,也是执行save方法,其他的情况就会使用update.
get和load区别:
返回结果上:load方法如果检索不到结果的话会抛异常,get方法如果检索不到结果的话会返回null
检索机制上:load方法的检索机制非常复杂(检索缓存,判断lazy,查询数据库),get方法直接去数据库中进行检索
延迟加载上:load方法使用代理进行延迟加载,get方法不使用延迟加载
9,hibernate缓存机制(缓存为的是提高查询的效率)
[首先说明什么是缓存] 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用,这样就提高了查询的效率,减轻服务器的压力。
一级缓存(session缓存/事物缓存):
session其实就是一个Map<id,String>集合,只在一个session/事物/线程中有效.
支持:get方法,load方法,save方法(将对象添加到一级缓存中)
不支持:对象查询,对象属性查询,QBC
生命周期:一级缓存的生命周期其实与session同时创建同时消亡
管理:session. evict(obj)放逐出session缓存中某个对象.session.clear()清空一级缓存中的所有的对象
二级缓存(sessionFactory缓存):
实现在不同的session/事物/线程中数据的共享,二级缓存独立于Hibernate的软件部件,属于第三方的产品
使用:添加支持二级缓存的jar包ehcache-1.2.3.jar,添加配置文件ehcache.xml, 在hibernate.cfg.xml中配置二级缓存在实体映射文件(User.hbm.xml)中或者hibernate.cfg.xml中指明使用二级缓存的对象,
支持:get方法,load方法
不支持:对象查询,对象属性查询,QBC
查询缓存:
支持:属性查询
不支持:对象查询,QBC
查询一个对象建议使用二级缓存+查询缓存
10,hibernate锁机制
(1) 悲观锁
使用数据的方式完成,可以防止重复更新
select * from t_user user0_ where user0_.user_id=? for update
用户执行完修改才会释放锁资源,其他用户可以查看这行信息,用户不释放锁资源,
其他用户只能处于等待状态,超过等待时间,就出现异常,连接超时
对象查询时加入LockMode.UPGRADE
User user = (User)session.get(User.class, 1,LockMode.UPGRADE);
(2)乐观锁
乐观锁是hibernate提供的一种锁机制
乐观锁类似于版本管理器中的version,对一个对象进行更新操作时,首先判断当前的version是否跟之前查询时的version相同,如果相同的话,那么进行更新,如果不同,抛异常
使用方式:
(1)在对象模型中添加一个属性(version)(实体类中添加)private int version;
(2)在映射文件中设置使用锁的类型(User.hbm.xml中)
<class name="com.sun.entity.User" table="t_user" optimistic-lock="version">
(3)* 配置version属性(User.hbm.xml中)<version name="version"/>
11,hibernate工作原理
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
Hibernate面试总结
制作人:Oak_Sun[2012-10-2]
相关推荐
最新的Hibernate面试总结,Java程序员面试需要准备的东西!
本人工作7年总结的一些hibernate面试大纲,一般都会包括在里面,适合1到5年工作经验的人。
Struts、Spring和Hibernate是Java开发中常用的三大框架,它们分别负责不同的职责。Struts作为MVC模式的实现,主要用于处理Web应用中的视图和控制逻辑;Spring则是一个全面的后端框架,提供了依赖注入、AOP(面向切面...
Struts、Spring和Hibernate是Java开发中的三大框架,它们各自承担着不同的职责,共同构建了企业级应用的基础架构。在面试中,对于这三个框架的掌握程度往往被视为衡量开发者技能水平的重要标准。 Struts是一个基于...
Struts、Spring 和 Hibernate 是三个非常重要的 Java Web 开发框架,它们在面试中经常被问及。下面将分别介绍这三个框架的工作原理以及使用它们的原因。 Struts 是一个基于 Model-View-Controller(MVC)设计模式的...
以上总结了Hibernate的一些核心概念和面试中可能遇到的关键知识点。了解这些概念有助于更好地掌握Hibernate框架的使用,以及如何高效地利用Hibernate进行数据库操作。此外,对于面试者而言,熟悉这些概念也能帮助...
Hibernate是Java领域中一款流行的持久...以上就是Hibernate面试中常见的问题和答案,涵盖了基本概念、缓存策略、查询方式以及事务和数据访问等方面的知识点。理解并掌握这些内容对于深入学习和使用Hibernate至关重要。
### 常见Hibernate面试题知识点详解 #### 1. Hibernate查询数据的方式 - **导航对象图查询**:这是最基本的查询方式之一,适用于查询对象之间的关联关系。通过已知对象来导航到其他对象,比如通过一个`User`对象...
spring +hibernate+struts面试总结
这些知识点涵盖了常见的面试问题,可以帮助准备面试或深入理解Hibernate技术的人士更好地掌握该领域的内容。 ### Hibernate的检索方式 1. **导航对象图检索**:通过已加载的对象来访问与其关联的对象,这种检索...
### Hibernate面试题详解 #### 1. Hibernate中的关系类型 题目描述了一种关系选择题,但实际给出的信息并不清晰。不过,根据选项推测,此题意在考察Hibernate中实体间的关系类型。 - **一对一 (One-to-One)** - *...
Struts、Hibernate 和 Spring 是Java开发中常用的三大框架,它们分别负责不同的职责:Struts作为MVC模式的实现,主要用于处理Web应用的控制逻辑;...在面试中,理解并能详细解释这些概念和技术是至关重要的。
SSH,即Struts、Spring和Hibernate,是Java开发中常用的一种技术栈,主要用于构建企业级应用。这三种框架分别在MVC模式中的表现层、业务层和服务层起到关键作用。以下是对SSH面试题中涉及的一些核心知识点的详细解释...
这篇面试题总结主要涉及Servlet的基础知识,包括其生命周期、工作原理以及与Struts、Spring、Hibernate的关系。 1. Servlet生命周期: - 初始化阶段:Servlet容器在接收到web应用部署描述符(web.xml)中的`...
【Struts工作原理】 Struts是一个开源的MVC框架,它的主要作用...Spring作为IoC/DI容器,可以管理和注入Struts的Action以及Hibernate的SessionFactory,提供事务管理、AOP等功能,进一步提升了应用的灵活性和可测试性。
【Hibernate 概述】 Hibernate 是一个流行的 ...面试时,除了了解 Hibernate 的基本概念和特点,面试官更希望听到你在实际项目中如何运用 Hibernate,以及遇到的问题和解决方案,体现出你的实践经验和问题解决能力。
以下是对 Struts、Hibernate 和 Spring 的经典面试题的总结,涵盖了这些框架的工作机制、优点、缓存机制、查询方式、优化方法等知识点。 Hibernate 1. Hibernate 工作原理及为什么要用? Hibernate 工作原理包括...
hibernate部分面试题,自己总结的哦。有些是应付考试用的,有的是工作需要,有的是工作和面试都需要的,所以要分清楚后掌握。以及掌握的程度。