重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“Hibernate面试题有哪些”,在日常操作中,相信很多人在Hibernate面试题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate面试题有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的灵台网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
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面试题有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!