Hibernate - 面试问题



尊敬的读者,这些Hibernate 面试问题是专门设计用来让您熟悉在Hibernate主题的面试中可能遇到的问题类型的。根据我的经验,优秀的采访者在面试期间很少计划提出任何特定问题,通常问题从主题的一些基本概念开始,然后根据进一步的讨论以及您的回答继续进行。

JDBC 代表 Java 数据库连接,并提供了一组 Java API 用于从 Java 程序访问关系数据库。这些 Java API 使 Java 程序能够执行 SQL 语句并与任何符合 SQL 标准的数据库进行交互。

ORM 代表Object-Relational Mapping(ORM),是一种将关系数据库和面向对象编程语言(如 Java、C# 等)之间的数据进行转换的编程技术。

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

序号 优势
1 允许业务代码访问对象而不是 DB 表。
2 隐藏 SQL 查询的细节,使其与 OO 逻辑分离。
3 基于底层的 JDBC。
4 无需处理数据库实现。
5 基于业务概念的实体,而不是数据库结构。
6 事务管理和自动键生成。
7 快速开发应用程序。

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

  • 企业级 JavaBeans 实体 Bean

  • Java 数据对象

  • Castor

  • TopLink

  • Spring DAO

  • Hibernate

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

Hibernate 将 Java 类映射到数据库表,并将 Java 数据类型映射到 SQL 数据类型,从而使开发人员免于 95% 的常见数据持久化相关编程任务。

以下是使用 Hibernate 的优势。

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

  • 提供简单的 API 用于将 Java 对象直接存储到数据库和从数据库检索 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 - 用于创建和执行面向对象的 Criteria 查询以检索对象。

Configuration 对象提供了两个关键组件:

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

  • 类映射设置

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

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

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

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

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

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

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

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

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

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

序号 属性和说明
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 连接使用自动提交模式。

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

  • 瞬时 - 持久化类的新的实例,它不与 Session 关联,在数据库中没有表示,并且没有标识符值被 Hibernate 视为瞬时。

  • 持久化 - 通过将其与 Session 关联,可以使瞬时实例持久化。持久化实例在数据库中具有表示形式、标识符值并与 Session 关联。

  • 脱管 - 关闭 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 会根据情况使用 save(Object) 或 update(Object) 方法保存或更新给定实例。

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

持久化类主要遵循以下规则,但这些规则并非硬性要求。

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

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

  • 所有将要持久化的属性都应声明为私有,并以 JavaBean 风格定义 getXXXsetXXX 方法。

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

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

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

映射文档是一个 XML 文档,其根元素为 <hibernate-mapping>,其中包含所有 <class> 元素。

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

<id> 元素将类中的唯一 ID 属性映射到数据库表的 primary key。id 元素的 name 属性引用类中的属性,column 属性引用数据库表中的列。type 属性保存 Hibernate 映射类型,此映射类型将 Java 类型转换为 SQL 数据类型。

id 元素中的 <generator> 元素用于自动生成 primary key 值。将 generator 元素的 class 属性设置为 native,让 Hibernate 根据底层数据库的功能选择 identity、sequencehilo 算法创建 primary key。

<property> 元素用于将 Java 类属性映射到数据库表中的列。元素的 name 属性引用类中的属性,column 属性引用数据库表中的列。type 属性保存 Hibernate 映射类型,此映射类型将 Java 类型转换为 SQL 数据类型。

这使用 <set> 元素映射,并使用 java.util.HashSet 初始化。

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

这使用 <list> 元素映射,并使用 java.util.ArrayList 初始化。

这使用 <bag> 或 <ibag> 元素映射,并使用 java.util.ArrayList 初始化。

这使用 <map> 元素映射,并使用 java.util.HashMap 初始化。

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

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

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

一对一关联类似于多对一关联,区别在于列将设置为唯一。例如,一个地址对象可以与一个员工对象关联。

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

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

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

<one-to-many> 元素的 set 元素指示一个对象与许多其他对象相关联。

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

<many-to-many> 元素指示一个对象与许多其他对象相关联,并且 column 属性用于链接中间列。

是的,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 缓存,是所有请求都必须经过的强制缓存。Session 对象在将对象提交到数据库之前将其保留在自己控制之下。

二级缓存是一个可选的缓存,在尝试在二级缓存中查找对象之前,始终会先查询一级缓存。二级缓存可以在每个类和每个集合的基础上配置,主要负责跨会话缓存对象。

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

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

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

  • 事务型 - 在极少数更新的情况下,对于主要用于读取的数据,使用此策略来防止并发事务中出现陈旧数据,这是至关重要的。

  • 读写型 - 同样,在极少数更新的情况下,对于主要用于读取的数据,使用此策略来防止并发事务中出现陈旧数据,这是至关重要的。

  • 非严格读写型 - 此策略不保证缓存和数据库之间的一致性。如果数据几乎从不更改并且出现少量陈旧数据的可能性并不重要,则使用此策略。

  • 只读型 - 适用于从不更改的数据的并发策略。仅将其用于参考数据。

接下来是什么?

接下来,您可以回顾一下您之前完成的与该主题相关的作业,并确保您能够自信地谈论它们。如果您是应届毕业生,面试官不会期望您能回答非常复杂的问题,而是您必须使自己的基础概念非常牢固。

其次,如果您无法回答一些问题,这实际上并不重要,但重要的是,无论您回答了什么,都必须自信地回答。所以在面试过程中要有自信。我们在 tutorialspoint 祝您面试顺利,并祝您未来的工作一切顺利。干杯 :-)

hibernate_questions_answers.htm
广告