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]
相关推荐
内容概要:本文提供了详细的MongoDB分片集群的搭建指导,涵盖了从环境准备、配置文件编写、副本集的建立、主节点的选择、配置服务器和数据分片服务器的配置到最后的路由节点的搭建与操作整个流程,以及对数据库的哈希与范围两种分片策略的应用介绍和具体命令执行。 适合人群:熟悉NoSQL数据库概念并对MongoDB有一定了解的技术人员,尤其是在大型数据管理和分布式数据库架构设计中有需求的开发者。 使用场景及目标:帮助技术人员掌握构建高效能、高可用性的MongoDB分片集群的方法,适用于处理大规模、实时性强的数据存储与读取场景。 其他说明:文中通过实例演示了每个步骤的具体操作方法,便于跟随文档实操,同时也介绍了可能遇到的问题及其解决方案,如在没有正确配置的情况下试图写入数据时出现错误等情况的处理。
CPPC++_嵌入式硬件的物联网解决方案blinker库与Arduino ESP8266 ESP32一起工作
CPPC++_逆向调用QQ Mojo IPC与WeChat XPlugin
CPPC++_现代活动指标
CPPC++_Xournal是一款手写笔记软件,支持PDF注释,使用C语言编写,支持GTK3,支持Linux,如Ubu
资源概述: 本资源提供了一套完整的学生实习管理系统解决方案,涵盖了前台小程序页面与后台管理系统两大模块。前台小程序页面设计简洁直观,用户可根据不同身份(学生或企业)进行登录。学生用户能够方便地浏览并投递感兴趣的实习岗位,而企业用户则能轻松发布实习信息,吸引优秀人才。后台管理系统功能全面,包括个人中心、首页、学生管理、教师管理、企业管理、招聘管理、评分管理以及实习管理等多个方面,为管理员提供了强大的数据管理和操作工具。 技术栈亮点: SSM框架:系统后台采用Spring、Spring MVC和MyBatis Plus(简称SSM)作为核心开发框架,确保了系统的稳定性、可扩展性和可维护性。Spring作为控制反转(IoC)和面向切面编程(AOP)的容器,为系统提供了强大的业务逻辑处理能力;Spring MVC则负责处理Web请求和响应,实现了前后端的分离;MyBatis Plus作为持久层框架,简化了数据库操作,提高了开发效率。 MySQL数据库:系统采用MySQL作为数据库存储解决方案,支持大数据量的存储和高效查询。 如有侵权请联系我删除,谢谢
微服务闪聚支付项目
博客链接 https://blog.csdn.net/weixin_47560078/article/details/143714557 文章从原理介绍出发,实现了 Rust 与 Java 的互调。利用 JNI 技术,可以充分发挥 Rust 的性能优势,同时保持 Java 的跨平台特性。这种技术组合适用于对性能要求较高的应用场景,如图像处理、数据分析和系统级编程等。
cppc++
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
分布式事务lcn
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
cppc++
安卓手机与电脑的socket通信源码
Anaconda:JupyterNotebook使用教程.docx
Amazon S3:S3静态网站托管教程.docx
Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。 Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析可视化项目源码(期末大作业).zip,个人经导师指导并认可通过的98分大作业设计项目。主要针对计算机相关专业的正在做期末大作业设计的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,代码资料完整下载可用。Python商品销售数据分析
CPPC++_wechathookWeChatApi微信Api微信hook微信接口python微信接口java微信Ap