Hibernate 面试问题(Hibernate Interview Questions)

优质
小牛编辑
119浏览
2023-12-01

亲爱的读者们,这些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 ?)

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