目录

Hibernate面试问题(Hibernate Interview Questions)

亲爱的读者们,这些Hibernate Interview Questions专门设计用于让您熟悉在面试Hibernate时可能遇到的问题的本质。 根据我的经验,很好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的问题 -

JDBC代表Java Database Connectivity,它提供了一组Java API,用于从Java程序访问关系数据库。 这些Java API使Java程序能够执行SQL语句并与任何SQL兼容的数据库进行交互。

ORM代表O bject- R elational M apping(ORM)是一种用于在关系数据库和面向对象的编程语言(如Java,C#等)之间转换数据的编程技术。

与普通JDBC相比,ORM系统具有以下优势

Sr.No. 好处
1 允许业务代码访问对象而不是数据库表。
2 隐藏来自OO逻辑的SQL查询的详细信息。
3 基于JDBC'引擎盖'
4 无需处理数据库实现。
5 实体基于业务概念而非数据库结构。
6 事务管理和自动密钥生成。
7 应用程序的快速发展。

Java中有几个持久性框架和ORM选项。

  • Enterprise JavaBeans Entity Beans

  • Java数据对象

  • Castor

  • TopLink

  • SpringDAO

  • Hibernate

Hibernate是JAVA的对象关系映射(ORM)解决方案,它是由Gavin King在2001年创建的一个开源持久框架。它是一个功能强大,高性能的对象关系持久性和查询服务,适用于任何Java应用程序。

Hibernate将Java类映射到数据库表,并将Java数据类型映射到SQL数据类型,并将开发人员从95%的常见数据持久性相关编程任务中解放出来。

以下是使用Hibernate的优点。

  • Hibernate负责使用XML文件将Java类映射到数据库表,而无需编写任何代码行。

  • 提供简单的API,用于直接在数据库中存储和检索Java对象。

  • 如果数据库或任何表中有更改,则只需要更改XML文件属性。

  • 摘要不熟悉的SQL类型,并提供我们解决熟悉的Java对象。

  • Hibernate不需要应用程序服务器来运行。

  • 操纵数据库对象的复杂关联。

  • 使用智能提取策略最大限度地减少数据库访问。

  • 提供简单的数据查询。

Hibernate几乎支持所有主要的RDBMS。 以下是Hibernate支持的一些数据库引擎的列表。

  • HSQL数据库引擎

  • DB2/NT

  • MySQL

  • PostgreSQL

  • FrontBase

  • Oracle

  • Microsoft SQL Server数据库

  • Sybase SQL Server

  • Informix Dynamic Server

Hibernate支持各种其他技术,包括以下技术 -

  • XDoclet Spring

  • J2EE

  • Eclipse插件

  • Maven

以下是Hibernate的关键组件/对象 -

  • Configuration - 表示Hibernate所需的配置或属性文件。

  • SessionFactory - 使用提供的配置文件为应用程序配置Hibernate,并允许实例化Session对象。

  • Session - 用于获取与数据库的物理连接。

  • Transaction - 表示数据库的工作单元,大多数RDBMS支持事务功能。

  • Query - 使用SQL或Hibernate查询语言(HQL)字符串从数据库中检索数据并创建对象。

  • Criteria - 用于创建和执行面向对象的条件查询以检索对象。

Configuration对象提供了两个键组件 -

  • Database Connection - 这是通过Hibernate支持的一个或多个配置文件来处理的。 这些文件是hibernate.propertieshibernate.cfg.xml

  • Class Mapping Setup

  • 该组件创建Java类和数据库表之间的连接。

Configuration对象是您在任何Hibernate应用程序中创建的第一个Hibernate对象,通常在应用程序初始化期间只创建一次。 它表示Hibernate所需的配置或属性文件。

配置对象用于创建SessionFactory对象,该对象使用提供的配置文件为应用程序配置Hibernate,并允许实例化Session对象。 SessionFactory是一个线程安全对象,由应用程序的所有线程使用。

SessionFactory是重量级对象,因此通常在应用程序启动期间创建它并保留供以后使用。 每个数据库使用一个单独的配置文件需要一个SessionFactory对象。 因此,如果您使用多个数据库,则必须创建多个SessionFactory对象。

会话用于获取与数据库的物理连接。 Session对象是轻量级的,旨在每次与数据库进行交互时进行实例化。 持久对象通过Session对象保存和检索。

会话对象不应该长时间保持打开状态,因为它们通常不是线程安全的,应该根据需要创建和销毁它们。

事务表示数据库的工作单元,大多数RDBMS支持事务功能。 Hibernate中的事务由底层事务管理器和事务(来自JDBC或JTA)处理。

这是一个可选对象,Hibernate应用程序可以选择不使用此接口,而是在自己的应用程序代码中管理事务。

查询对象使用SQL或Hibernate查询语言(HQL)字符串从数据库中检索数据并创建对象。 Query实例用于绑定查询参数,限制查询返回的结果数,最后执行查询。

Criteria对象用于创建和执行面向对象的条件查询以检索对象。

Sr.No. 属性和描述
1

hibernate.dialect

此属性使Hibernate为所选数据库生成适当的SQL。

2

hibernate.connection.driver_class

JDBC驱动程序类。

3

hibernate.connection.url

数据库实例的JDBC URL。

4

hibernate.connection.username

数据库用户名。

5

hibernate.connection.password

数据库密码。

6

hibernate.connection.pool_size

限制在Hibernate数据库连接池中等待的连接数。

7

hibernate.connection.autocommit

允许自动提交模式用于JDBC连接。

在给定时间点,实例可能存在以下三种状态之一 -

  • transient - 一个持久化类的新实例,它与Session无关,在数据库中没有任何表示,Hibernate认为没有标识符值是瞬态的。

  • persistent - 您可以通过将瞬态实例与Session相关联来使其持久化。 持久化实例在数据库中具有表示,标识符值并与会话相关联。

  • detached - 一旦我们关闭Hibernate Session,持久化实例将成为一个分离的实例。

Session.beginTransaction方法开始一个工作单元并返回关联的Transaction对象。

Session.createCriteria为给定的实体类或实体类的超类创建新的Criteria实例。

Session.createQuery为给定的HQL查询字符串创建一个新的Query实例。

Session.createSQLQuery为给定的SQL查询字符串创建一个新的SQLQuery实例。

Session.delete从数据存储中删除持久性实例。

Session.get使用给定标识符返回给定命名实体的持久实例,如果没有此类持久实例,则返回null。

Session.refresh从底层数据库重新读取给定实例的状态。

Session.save从底层数据库中保存给定实例的状态。

Session.update从底层数据库更新给定实例的状态。

Session.saveOrUpdate保存(Object)或更新(Object)给定实例。

其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类。

持久化类有以下主要规则,但是,这些规则都不是硬性要求。

  • 将持久化的所有Java类都需要默认构造函数。

  • 所有类都应包含一个ID,以便在Hibernate和数据库中轻松识别您的对象。 此属性映射到数据库表的主键列。

  • 将持久化的所有属性都应声明为private,并且在JavaBean样式中定义了getXXXsetXXX方法。

  • Hibernate的一个核心功能是代理,它依赖于持久化的类是非final的,或者是声明所有公共方法的接口的实现。

  • 所有不扩展或实现EJB框架所需的专用类和接口的类。

对象/关系映射通常在XML文档中定义。 此映射文件指示Hibernate如何将定义的类或类映射到数据库表。 我们应该将映射文档保存在格式为 .hbm.xml的文件中。

映射文档是具有《hibernate-mapping》作为根元素的XML文档,其包含所有“类”元素。

《class》元素用于定义从Java类到数据库表的特定映射。 使用class元素的name属性指定Java类名,并使用table属性指定数据库表名。

《id》元素将类中的唯一ID属性映射到数据库表的主键。 id元素的name属性引用类中的属性, column属性引用数据库表中的列。 type属性包含hibernate映射类型,这种映射类型将从Java转换为SQL数据类型。

id元素中的《generator》元素用于自动生成主键值。 设置generator元素的class属性设置为native ,让hibernate选择identity, sequencehilo算法来创建主键,具体取决于底层数据库的功能。

《property》元素用于将Java类属性映射到数据库表中的列。 元素的name属性引用类中的属性, column属性引用数据库表中的列。 type属性包含hibernate映射类型,这种映射类型将从Java转换为SQL数据类型。

这是使用元素映射的,并使用java.util.HashSet初始化。

它使用元素映射,并使用java.util.TreeSet初始化。 sort属性可以设置为比较器或自然排序。

它使用元素映射,并使用java.util.ArrayList初始化。

它使用元素映射,并使用java.util.ArrayList初始化。

它使用元素映射,并使用java.util.HashMap初始化。

这是使用元素映射的,并使用java.util.TreeMap初始化。 sort属性可以设置为比较器或自然排序。

多对一关联是最常见的关联类型,其中Object可以与多个对象相关联。 例如,相同的地址对象可以与多个雇员对象相关联。

元素用于定义多对一关联。 name属性设置为父类中定义的变量。 column属性用于设置父表中的列名。

一对一关联类似于多对一关联,不同之处在于该列将被设置为唯一。 例如,地址对象可以与单个雇员对象相关联。

元素用于定义一对一关联。 name属性设置为父类中定义的变量。 column属性用于设置父表中的列名,该表设置为唯一,以便只有一个对象可以与另一个对象关联。

在一对多映射关联中,对象可以与多个对象相关联。 例如,Employee对象涉及许多Certificate对象。

可以使用不包含任何重复元素的Set java集合来实现一对多映射。

set元素的元素表示一个对象与许多其他对象相关。

可以使用不包含任何重复元素的Set java集合来实现多对多映射。

元素表示一个对象与许多其他对象相关,列属性用于链接中间列。

是的,SessionFactory是一个线程安全的,可以同时由多个线程访问。

不,Session不是线程安全的。

session.save保存对象并返回实例的id,而persist在保存实例后不返回任何内容。

get()和load()方法之间存在以下差异。

  • 如果没有数据,则get()返回null,在这种情况下,load会抛出ObjectNotFoundException异常。

  • get()总是命中数据库,而load()方法不会命中数据库。

  • get()返回实际对象,而load()返回代理对象。

  • Hibernate的一个核心功能是代理,它依赖于持久化的类是非final的,或者是声明所有公共方法的接口的实现。

  • 所有不扩展或实现EJB框架所需的专用类和接口的类。

延迟加载是一种按需加载对象的技术。 从Hibernate 3开始,默认情况下启用延迟加载,以便在加载父级时不加载子对象。

HQL代表Hibernate查询语言。 它以与SQL占用表格相同的方式获取java对象。 HQL是面向对象的查询语言,与数据库无关。

第一级缓存是会话缓存,是所有请求必须通过的强制缓存。 Session对象在将对象提交到数据库之前将其保持在自己的权限之下。

二级缓存是可选缓存,在尝试在二级缓存中定位对象之前,将始终查询第一级缓存。 可以基于每个类和每个集合配置二级缓存,主要负责跨会话缓存对象。

Hibernate还为查询结果集实现了一个缓存,它与二级缓存紧密集成。

这是一个可选功能,需要两个额外的物理缓存区域,用于保存缓存的查询结果和上次更新表时的时间戳。 这仅适用于使用相同参数频繁运行的查询。

并发策略是一个中介,负责将数据项存储在缓存中并从缓存中检索它们。 如果要启用二级缓存,则必须为每个持久化类和集合决定使用哪种缓存并发策略。

  • Transactional - 在极少数更新的情况下,将此策略用于读取主要数据,这对于防止并发事务中的过时数据至关重要。

  • Read-write - 再次将此策略用于读取主要数据,在这种情况下,在极少数情况下更新时,防止并发事务中的陈旧数据至关重要。

  • Nonstrict-read-write - 此策略不保证缓存和数据库之间的一致性。 如果数据几乎没有变化,并且过时数据的可能性很小,则不要使用此策略。

  • Read-only - 适用于永不更改的数据的并发策略。 仅用于参考数据。

接下来是什么? (What is Next ?)

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

↑回到顶部↑
WIKI教程 @2018