`

hibernate面试常见的几个问题

 
阅读更多

在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的。Hibernate框架在Java 界的成功和高度的可接受性使得它成为了Java技术栈中最受欢迎的对象关系影射(ORM)解决方案。Hibernate将你从数据库相关的编码中解脱了出来,使你可以更加专注地利用强大的面向对象的设计原则来实现核心的业务逻辑。采用Hibernate后,你就能够相当容易地在不同的数据库间进行切换,而且你还可以利用Hibernate提供的开箱即用的二级缓存以及查询缓存功能。你也知道,大部分Java面试中所提的问题不仅仅会涉及Java的核心部分,而且还会涉及其它的Java框架,比如,根据项目的要求也有可能会问到Spring 框架方面的问题或者Struts方面的问题。如果你要参加的项目使用了Hibernate作为ORM解决方案,你就英国同时准备好回答Spring和Hibernate这两个框架方面的问题。好好看看JD或者职位说明,如果其中的任何地方出现了Hibernate这个词,就要准备好怎样来面对Hibernate方面的问题。

本文给出了一个Hibernate面试问题列表,这些都是我从朋友以及同事那里搜集来的。Hibernate 是一个非常流行的对象关系影射框架,熟稔Hibernate的优势所在和Hibernate的Sesion API是搞定Hibernate面试之关键所在。

Hibernate中get和load有什么不同之处? 把get和load放到一起进行对比是Hibernate面试时最常问到的问题,这是因为只有正确理解get()和load()这二者后才有可能高效地使用Hibernate。get和load的最大区别是,如果在缓存中没有找到相应的对象,get将会直接访问数据库并返回一个完全初始化好的对象,而这个过程有可能会涉及到多个数据库调用;而load方法在缓存中没有发现对象的情况下,只会返回一个代理对象,只有在对象getId()之外的其它方法被调用时才会真正去访问数据库,这样就能在某些情况下大幅度提高性能。你也可以参考 Hibernate中get和load的不同之处, 此链接给出了更多的不同之处并对该问题进行了更细致的讨论。 

Hibernate中save、persist和saveOrUpdate这三个方法的不同之处? 除了get和load,这又是另外一个经常出现的Hibernate面试问题。 所有这三个方法,也就是save()、saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别。例如,save()只能INSERT记录,但是saveOrUpdate()可以进行 记录的INSERT和UPDATE。还有,save()的返回值是一个Serializable对象,而persist()方法返回值为void。你还可以访问 save、persist以及saveOrUpdate,找到它们所有的不同之处。 Hibernate中的命名SQL查询指的是什么? Hibernate的这个面试问题同Hibernate提供的查询功能相关。命名查询指的是用<sql-query>标签在影射文档中定义的SQL查询,可以通过使用Session.getNamedQuery()方法对它进行调用。命名查询使你可以使用你所指定的一个名字拿到某个特定的查询。 Hibernate中的命名查询可以使用注解来定义,也可以使用我前面提到的xml影射问句来定义。在Hibernate中,@NameQuery用来定义单个的命名查询,@NameQueries用来定义多个命名查询。 

Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗? 这也是Hibernate框架的常见面试问题。顾名思义,SessionFactory就是一个用于创建Hibernate的Session对象的工厂。 SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。Java JEE应用一般只有一个SessionFactory,服务于客户请求的各线程都通过这个工厂来获得Hibernate的Session实例,这也是为什么SessionFactory接口的实现必须是线程安全的原因。还有,SessionFactory的内部状态包含着同对象关系影射有关的所有元数据,它是 不可变的,一旦创建好后就不能对其进行修改了。Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享? 前面的问题问完之后,通常就会接着再问这两个问题。问完SessionFactory的问题后就该轮到Session了。Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且 不是线程安全的,也就是说,Hibernage中的Session不能在多个线程间进行共享。虽然Session会以主动滞后的方式获得数据库连接,但是Session最好还是在用完之后立即将其关闭。 

hibernate中sorted collection和ordered collection有什么不同? T这个是你会碰到的所有Hibernate面试问题中比较容易的问题。sorted collection是通过使用 Java的Comparator在内存中进行排序的,ordered collection中的排序用的是数据库的order by子句。对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java中的OutOfMemoryError,最好使用ordered collection。 Hibernate中transient、persistent、detached对象三者之间有什么区别? 在Hibernate中,对象具有三种状态:transient、persistent和detached。同Hibernate的session有关联的对象是persistent对象。对这种对象进行的所有修改都会按照事先设定的刷新策略,反映到数据库之中,也即,可以在对象的任何一个属性发生改变时自动刷新,也可以通过调用Session.flush()方法显式地进行刷新。如果一个对象原来同Session有关联关系,但当下却没有关联关系了,这样的对象就是detached的对象。你可以通过调用任意一个session的update()或者saveOrUpdate()方法,重新将该 detached对象同相应的seesion建立关联关系。Transient对象指的是新建的持久化类的实例,它还从未同Hibernate的任何 Session有过关联关系。同样的,你可以调用persist()或者save()方法,将transient对象变成persistent对象。可要记住,这里所说的transient指的可不是 Java中的transient关键字,二者风马牛不相及。

Hibernate中Session的lock()方法有什么作用? 这是一个比较棘手的Hibernate面试问题,因为Session的lock()方法重建了关联关系却并没有同数据库进行同步和更新。因此,你在使用 lock()方法时一定要多加小心。顺便说一下,在进行关联关系重建时,你可以随时使用Session的update()方法同数据库进行同步。有时这个问题也可以这么来问:Session的lock()方法和update()方法之间有什么区别?。这个小节中的关键点也可以拿来回答这个问题。

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

Hibernate中的查询缓存指的是什么? 这个问题有时是作为上个Hibernate面试问题的后继问题提出的。查询缓存实际上保存的是sql查询的结果,这样再进行相同的sql查询就可以之间从缓存中拿到结果了。为了改善性能,查询缓存可以同二级缓存一起来使用。Hibernate支持用多种不同的开源缓存方案,比如EhCache,来实现查询缓存。

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

每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。可不可以将Hibernate的实体类定义为final类? 
是的,你可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。不过,如果你的持久化类实现了一个接口而且在该接口中声明了所有定义于实体类中的所有public的方法轮到话,你就能够避免出现前面所说的不利后果。 

Java开发者的Hibernate面试问答列表就到此为止了。没人会对Hibernate作为ORM解决方案的受欢迎程度产生怀疑,如果你要申请的是 Java J2EE方面的职位,你就等着人来问你Hibernate方面的面试问题吧。在JEE界,Spring和Hibernate是两个最流行的Java框架。要是你被问到了其它也值得分享的Hibernate方面的面试问题, 别忘了在Java社区中同大家分享一下。 

分享到:
评论

相关推荐

    常见hibernate面试题.doc

    ### 常见Hibernate面试题知识点详解 #### 1. Hibernate查询数据的方式 - **导航对象图查询**:这是最基本的查询方式之一,适用于查询对象之间的关联关系。通过已知对象来导航到其他对象,比如通过一个`User`对象...

    hibernate面试题

    在Java的持久化框架Hibernate中,面试经常涉及的关键知识点包括数据库优化、多表查询处理以及Session的load()和get()方法的区别。...在准备Hibernate面试时,应确保对这些知识点有深入的理解和实践经验。

    spring面试常见问题

    标题《Spring面试常见问题》中的知识点涵盖了关于Spring框架的多个方面的内容。Spring是一个开源的Java企业级应用开发框架,它包含了一系列核心的特性,可以用于开发任何Java应用程序。Spring框架的设计目标是简化...

    Struts+Hibernate+Spring常见面试题

    Hibernate是一个对象关系映射(ORM)框架,用于简化Java应用程序与数据库的交互。它允许开发人员将Java对象映射到数据库表,通过对象来操作数据。查询数据的方式主要有以下几种: 1. HQL(Hibernate Query Language...

    JAVA工程师面试常见问题及答案

    ### JAVA工程师面试常见问题及答案解析 #### 1. 事务隔离级别 事务隔离级别是数据库系统为了保证数据的一致性和防止并发操作引起的问题而设置的不同级别。主要有四种不同的隔离级别: - **READ UNCOMMITTED (未...

    Hibernate面试题

    ### Hibernate常见面试题详解 #### 一、关系数据模型与对象模型之间的匹配关系 1. **表对应类**:在Hibernate中,一个数据库表通常对应一个Java类。这个类会包含对应于表中各列的属性,从而形成实体类与数据库表...

    J2EE之struts,spring,hibernate经典面试题目

    面试中可能会问到以下几个关键点: 1. **Action和ActionForm**:Action是处理用户请求的核心组件,ActionForm则用于封装表单数据,通常对应于业务逻辑层的实体对象。 2. **配置文件**:Struts的配置主要在struts-...

    JavaEE面试常见问题及答案

    ### JavaEE面试常见问题及答案解析 #### 一、MVC模式详解 **MVC** (Model-View-Controller) 是一种广泛应用于Web应用程序开发的设计模式。它将应用程序分为三个核心部分: - **Model(模型)**: 负责业务逻辑处理...

    java软件开发面试常见题

    Java软件开发面试是每个Java程序员职业生涯中的重要环节,它涵盖了基础语法、面向对象设计、数据结构与算法、并发编程、框架应用等多个方面的知识。以下是一些在Java面试中经常遇到的题目及其详解: 1. **Java基础*...

    去公司面试技巧大全常见的问题

    以下是一些面试技巧和常见问题的解答,涵盖了技术与非技术层面的知识点。 1. **自我介绍**: - 简单介绍自己的背景,包括教育经历、工作经验和专业技能。 - 描述个人特点,如团队合作能力、问题解决能力或创新...

    面试SSH常问问题及java面试的一些常问问题

    根据给定文件的信息,我们可以总结出以下几个主要的知识点: ### 1. Struts2 的拦截器(Interceptor)机制 在Struts2框架中,拦截器是处理请求的关键组件之一,可以用于实现诸如权限控制、日志记录等功能。下面...

    Java最常见200面试题以及解析

    举几个例子: 205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别? 新生代回收器:Serial、ParNew、Parallel Scavenge 老年代回收器:Serial Old、Parallel Old、CMS 整堆回收器:G1 新生代垃圾...

    JAVA面试问题,自己和别人总结

    本文总结了常见的JAVA面试问题,涵盖了JAVA基础、JSP、Servlet、XML、J2EE、MVC、数据库等方面的知识点。 一、JAVA基础部分 * 抽象类和接口的区别 * 作用域public、private、protected的区别 * 重写和重载的区别 *...

    ssh100道面试题

    面试中常见的Spring相关问题: - 什么是IoC和DI,它们在Spring中的实现方式。 - AOP的基本概念和在Spring中的应用,如切点、通知等。 - Spring事务管理的几种方式(编程式、声明式)及其优缺点。 - Spring MVC与...

    Spring常见面试问题(超详细)

    本文将深入探讨Spring框架的常见面试问题,包括其核心概念、优点、IOC(控制反转)和AOP(面向切面编程)的理解,以及它们在实际应用中的作用。 首先,Spring是一个提供IOC和AOP的轻量级容器框架。IOC,即控制反转...

    200+最常见Java面试题参考答案(嗯嗯).pdf

    综上所述,这份文件所对应的IT知识点包括但不限于以下几个方面: 1. Java基础知识点:包括Java语言的基本语法、数据类型、运算符、控制流等。 2. 面向对象编程:涵盖类和对象的概念、继承、封装、多态、接口和抽象...

    java开发面试总结

    这里,我们重点讨论几个关键知识点,包括前端技术、JavaScript、Ajax、Java基础以及Web开发框架。 1. **前端开发技术:CSS+DIV,JS,JQuery** - CSS+DIV:面试中可能会询问布局方式,如流式布局、网格布局和响应式...

    java工程师面试题大全-100%公司笔试题你都能碰到几个

    - **问题**: Hibernate中如何在离线查询中去除重复项? - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)`方法来去除查询结果中的重复项。 #### ...

    java面试题

    Hibernate和spring中常出现的几个异常 61 71.13. Hibernate与jdbc的联系 62 71.14. Hibernate与Spring的联系 62 71.15. Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页? 62 ...

    2020最全Java面试题以及答案解析.zip

    这个名为"2020最全Java面试题以及答案解析.zip"的压缩包文件,包含了对Java面试常见问题的全面总结和详尽解答,这对于准备Java面试的开发者来说是一份宝贵的资料。文件列表中的"2020最全Java面试题以及答案解析.docx...

Global site tag (gtag.js) - Google Analytics