java面试常见问题之Hibernate总结
作者:风度玉门 发布时间:2023-11-27 10:37:05
主要从以下十几个方面对Hibernate做总结,包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检索策略是什么,分别适用于哪种场合,ORM解决的不匹配问题, Hibernate映射继承关系的3种方式,Session的find()方法以及Query接口的区别等方面问题的总结,具体内容如下:
1 Hibernate的检索方式
Ø 导航对象图检索(根据已经加载的对象,导航到其他对象。)
Ø OID检索(按照对象的OID来检索对象。)
Ø HQL检索(使用面向对象的HQL查询语言。)
Ø QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线)
Ø 本地SQL检索(使用本地数据库的SQL查询语句。)
包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检索策略是什么,分别适用于哪种场合,ORM解决的不匹配问题, Hibernate映射继承关系的3种方式,Session的find()方法以及Query接口的区别等方面问题的总结
Ø 临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。
Ø 持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。
Ø 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
3 Hibernate的3种检索策略是什么,分别适用于哪种场合
Ø 立即检索
优点:对应用程序完全透明。
缺点:select语句数目多。
适用:类级别。
Ø 延迟检索
优点:由应用程序决定加载哪些对象,可以避免执行多余的select语句以及避免加载不需要访问的对象,节省内存空间,提高检索效率。
缺点:应用程序如果要访问游离态的代理类实例,必须保证它在持久化时已经被初始化。
适用:一对多或多对多关联。应用程序不需要立即访问或者根本不会访问的对象。
Ø 迫切左外连接检索
优点:对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以方便的从一个对象导航到另一个与它相关联的对象。使用了外连接,select语句数目少。
缺点:可能会加载程序不许要访问的对象。复杂的数据库表连接形象检索性能。
适用:一对一或多对一关联。应用程序需要立即访问的对象。数据库系统具有良好的表连接性能。
4 ORM解决的不匹配问题(域模型与关系模型之间存在的不匹配)
Ø 域模型是面向对象的,关系模型是面向关系的。
Ø 域模型中有继承关系,关系模型中不能直接表示继承关系。
Ø 域模型中有多对多关联关系,关系模型中通过连接表来表示多对多关联关系。
Ø 域模型中有双向关联关系,关系模型中只有单向参照关系,而且总是many参照one方。
Ø 域模型提倡精粒度模型,关系模型提倡粗粒度模型。
5 Hibernate映射继承关系的3种方式
Ø 整个的继承体系就用一张表(tableper hierarchy)
Ø 每个子类一张表,存放子类所特有的属性(tableper subclass)
Ø 每个具体类一张表(union-subclass),保存是子类完整信息(table per concrete )
6 Session的find()方法以及Query接口的区别
Session类的find()方法以及Query接口都支持HQL检索方式。这两者的区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。
7 Hibernate关联关系配置
Ø 一对一
Ø 一对多
Ø 多对多
8 简述Session的特点
Ø 不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
Ø Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。
Ø 在Session中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。
9 Hibernate中采用XML文件来配置对象-关系映射的优点
Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。软件开发人员可以独立设计域模型,不必强迫遵守任何规范。数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。
10 Session的缓存的作用
Ø 减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能。
Ø 保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变换,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。
11 多事务并发运行时的问题
Ø 第一类丢失更新
Ø 脏读
Ø 虚读/幻读
Ø 不可重复读
Ø 第二类丢失更新
12 session的清理和清空的区别
Ø session清理缓存是指按照缓存中对象的状态的变化来同步更新数据库;(Hibernate包含了三类session的Flush模式)
Ø 清空是session清除部分或全部对象或者session关闭;
13 Hibernate工作原理及为什么要用
Ø 原理
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
Ø 为什么要用
1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
14 Hibernate延迟加载
1.Hibernate2延迟加载实现:a)实体对象 b) 集合类型(Collection)
2.Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
15 Hibernate的缓存机制
1.一级缓存又叫内部缓存存在Hibernate,属于应用事务级缓存
2.二级缓存
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据。
c) 第三方缓存的实现
16 优化Hibernate
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显式多态
7.表字段要少,表关联不要怕多,有二级缓存撑腰
以上内容是针对java面试比较常见的Hibernate总结,希望能够帮助到大家。
猜你喜欢
- 初次接触spring-boot的时候,我们经常会看到这样的文章:“
- 一,网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中I
- 更新: 工作中突然想起来,关于Yaml的使用,并不属于Spring的范畴,是org.yaml.snakeyaml处理的。所以yaml的使用应
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但
- 1. 前言老板说,明天甲方要来看产品,你得造点数据,而且数据必须是“真”的,演示效果要好看一些,这样他才会买我们的产品,我好明年给你换个嫂子
- 前言本文的记录如何用CustomPaint、GestureDetector实现一个进度条控件。首先需要说明的是 flutter Materi
- 代码如下import java.util.concurrent.Callable;import java.util.concurrent.E
- 本文实例为大家分享了java实现猜数字游戏的具体代码,供大家参考,具体内容如下随机生成0~100的数字,通过控制台输入猜测数字,输出进行提示
- 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后
- Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()和no
- 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件&q
- 一、一级缓存二级缓存的概念解释(1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓
- 原理解析:利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。 根据线程的数量(假设有三个
- Android内部没有控件来直接显示文档,跳转WPS或其他第三方文档App体验性不好,使用腾讯X5内核能很好的解决的这一问题。一、下载腾讯X
- 阿里终面在线编程题,写出来与大家分享一下 有一个单向链表
- 关于idea2021最新激活教程,请点击此处,获取最新激活教程还有一种激活方法,点击此处获取吧 !下面看下IDEA 2021.2 启动报错问
- 什么是FTPFTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件.可以