Hibernate面试题有哪些

65次阅读
没有评论

共计 4579 个字符,预计需要花费 12 分钟才能阅读完成。

这篇文章主要介绍“Hibernate 面试题有哪些”,在日常操作中,相信很多人在 Hibernate 面试题有哪些问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate 面试题有哪些”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

1、什么是 Hibernate?

Hibernate 是一个架构, 用来对应 Java 对象数据库表对象。使用一个 xml 文件来配置。

2、为什么要使用 Hibernate?

①Hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。

②Hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。

③可以很方便的进行数据库的移植工作。

④提供了缓存机制,是程序执行更改的高效。

3、什么是 ORM 框架?

ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象。

使用 ORM 的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。

4、Hibernate 中如何在控制台查看打印的 SQL 语句?

在 Config 里面把 Hibernate. show_SQL 设置为 true 就可以。但不建议开启,开启之后会降低程序的运行效率。

5、Hibernate 中 get 和 load 有什么不同之处?

把 get 和 load 放到一起进行对比是 Hibernate 面试时最常问到的问题,这是因为只有正确理解 get()和 load()这二者后才有可能高效地使用 Hibernate。

get 和 load 的最大区别是,如果在缓存中没有找到相应的对象,get 将会直接访问数据库并返回一个完全初始化好的对象,而这个过程有可能会涉及到多个数据库调用。

而 load 方法在缓存中没有发现对象的情况下,只会返回一个代理对象,只有在对象 getId()之外的其它方法被调用时才会真正去访问数据库,这样就能在某些情况下大幅度提高性能。

你也可以参考 Hibernate 中 get 和 load 的不同之处,此链接给出了更多的不同之处并对该问题进行了更细致的讨论。

6、Hibernate 是如何工作的?

①读取并解析配置文件。

②读取并解析映射文件,创建 SessionFactory。

③打开 Session。

④创建事务。

⑤进行持久化操作。

⑥提交事务。

⑦关闭 Session。

⑧关闭 SessionFactory。

7、Hibernate 中 save、persist 和 saveOrUpdate 这三个方法的不同之处?

除了 get 和 load,这又是另外一个经常出现的 Hibernate 面试问题。
所有这三个方法,也就是 save()、saveOrUpdate()和 persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别。

例如,save()只能 INSERT 记录,但是 saveOrUpdate()可以进行 记录的 INSERT 和 UPDATE。

还有,save()的返回值是一个 Serializable 对象,而 persist()方法返回值为 void。你还可以访问
save、persist 以及 saveOrUpdate,找到它们所有的不同之处。

8、Hibernate 中的命名 SQL 查询指的是什么?

Hibernate 的这个面试问题同 Hibernate 提供的查询功能相关。命名查询指的是用标签在影射文档中定义的 SQL 查询,可以通过使用 Session.getNamedQuery()方法对它进行调用。

命名查询使你可以使用你所指定的一个名字拿到某个特定的查询。
Hibernate 中的命名查询可以使用注解来定义,也可以使用我前面提到的 xml 影射问句来定义。

在 Hibernate 中,@NameQuery 用来定义单个的命名查询,@NameQueries 用来定义多个命名查询。

9、在 Hibernate 中 Java 对象的状态有哪些 ?

①临时状态(transient):不处于 Session 的缓存中。OID 为 null 或 等于 id 的 unsaved-value 属性值

②持久化状态(persistent):加入到 Session 的缓存中。

③游离状态(detached):已经被持久化,但不再处于 Session 的缓存中。

10、Hibernate 中的 SessionFactory 有什么作用?

SessionFactory 是线程安全的吗?
这也是 Hibernate 框架的常见面试问题。顾名思义,SessionFactory 就是一个用于创建 Hibernate 的 Session 对象的工厂。

SessionFactory 通常是在应用启动时创建好的,应用程序中的代码用它来获得 Session 对象。作为一个单个的数据存储,它也是
线程安全的,所以多个线程可同时使用同一个 SessionFactory。

Java
JEE 应用一般只有一个 SessionFactory,服务于客户请求的各线程都通过这个工厂来获得 Hibernate 的 Session 实例,这也是为什么 SessionFactory 接口的实现必须是线程安全的原因。

还有,SessionFactory 的内部状态包含着同对象关系影射有关的所有元数据,它是不可变的,一旦创建好后就不能对其进行修改了。

11、Hibernate 中的 Session 指的是什么? 可否将单个的 Session 在多个线程间进行共享?

前面的问题问完之后,通常就会接着再问这两个问题。问完 SessionFactory 的问题后就该轮到 Session 了。Session 代表着 Hibernate 所做的一小部分工作,它负责维护者同数据库的链接而且不是线程安全的。

也就是说,Hibernage 中的 Session 不能在多个线程间进行共享。虽然 Session 会以主动滞后的方式获得数据库连接,但是 Session 最好还是在用完之后立即将其关闭。

12、Hibernate 中 sorted collection 和 ordered collection 有什么不同?

这个是你会碰到的所有 Hibernate 面试问题中比较容易的问题。sorted collection 是通过使用
Java 的 Comparator 在内存中进行排序的,ordered collection 中的排序用的是数据库的 order by 子句。

对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java 中的 OutOfMemoryError,最好使用 ordered
collection。

13、Hibernate 中 transient、persistent、detached 对象三者之间有什么区别?

在 Hibernate 中,对象具有三种状态:transient、persistent 和 detached。同 Hibernate 的 session 有关联的对象是 persistent 对象。

对这种对象进行的所有修改都会按照事先设定的刷新策略,反映到数据库之中,也即,可以在对象的任何一个属性发生改变时自动刷新,也可以通过调用 Session.flush()方法显式地进行刷新。

如果一个对象原来同 Session 有关联关系,但当下却没有关联关系了,这样的对象就是 detached 的对象。你可以通过调用任意一个 session 的 () 或者 saveOrUpdate()方法,重新将该 detached 对象同相应的 seesion 建立关联关系。

Transient 对象指的是新建的持久化类的实例,它还从未同 Hibernate 的任何 Session 有过关联关系。同样的,你可以调用 persist()或者 save()方法,将 transient 对象变成 persistent 对象。

可要记住,这里所说的 transient 指的可不是 Java 中的 transient 关键字,二者风马牛不相及。

14、Hibernate 中 Session 的 lock()方法有什么作用?

这是一个比较棘手的 Hibernate 面试问题,因为 Session 的 lock()方法重建了关联关系却并没有同数据库进行同步和更新。因此,你在使用 lock()方法时一定要多加小心。

顺便说一下,在进行关联关系重建时,你可以随时使用 Session 的 () 方法同数据库进行同步。有时这个问题也可以这么来问:Session 的 lock()方法和 () 方法之间有什么区别?。这个小节中的关键点也可以拿来回答这个问题。

15、Hibernate 中二级缓存指的是什么?

这是同 Hibernate 的缓存机制相关的第一个面试问题,不出意外后面还会有更多这方面的问题。二级缓存是在 SessionFactory 这个级别维护的缓存,它能够通过节省几番数据库调用往返来提高性能。还有一点值得注意,二级缓存是针对整个应用而不是某个特定的 session 的。

16、Hibernate 中的查询缓存指的是什么?

这个问题有时是作为上个 Hibernate 面试问题的后继问题提出的。查询缓存实际上保存的是 sql 查询的结果,这样再进行相同的 sql 查询就可以之间从缓存中拿到结果了。

为了改善性能,查询缓存可以同二级缓存一起来使用。Hibernate 支持用多种不同的开源缓存方案,比如 EhCache,来实现查询缓存。

17、为什么在 Hibernate 的实体类中要提供一个无参数的构造器这一点非常重要?

每个 Hibernate 实体类必须包含一个 无参数的构造器, 这是因为 Hibernate 框架要使用 Reflection
API,通过调用 Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个 InstantiationException 异常。

18、可不可以将 Hibernate 的实体类定义为 final 类?

是的,你可以将 Hibernate 的实体类定义为 final 类,但这种做法并不好。因为 Hibernate 会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成 final 类之后,因为
Java 不允许对 final 类进行扩展,所以 Hibernate 就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。

不过,如果你的持久化类实现了一个接口而且在该接口中声明了所有定义于实体类中的所有 public 的方法,你就能够避免出现前面所说的不利后果。

19、Hibernate 的优缺点

①优点:

对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复 性代码 ;

映射的灵活性, 它支持各种关系数据库, 从一对一到多对多的各种复 杂关系;

非侵入性、移植性会好;

缓存机制: 提供一级缓存和二级缓存。

②缺点:

无法对 SQL 进行优化 ;

框架中使用 ORM 原则, 导致配置过于复杂;

执行效率和原生的 JDBC 相比偏差: 特别是在批量数据处理的时候 ;

不支持批量修改、删除。

20、Hibernate 实体类必须要有无参构造函数吗? 为什么?

Hibernate 中每个实体类必须提供一个无参构造函数,因为 Hibernate 框架要使用 reflection api,通过调用
ClassnewInstance() 来创建实体类的实例,如果没有无参的构造函数就会抛出异常。

到此,关于“Hibernate 面试题有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计4579字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)