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.properties和hibernate.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样式中定义了getXXX和setXXX方法。
Hibernate的一个核心功能是代理,它依赖于持久化的类是非final的,或者是声明所有公共方法的接口的实现。
所有不扩展或实现EJB框架所需的专用类和接口的类。
对象/关系映射通常在XML文档中定义。 此映射文件指示Hibernate如何将定义的类或类映射到数据库表。 我们应该将映射文档保存在格式为
映射文档是具有《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, sequence或hilo算法来创建主键,具体取决于底层数据库的功能。
《property》元素用于将Java类属性映射到数据库表中的列。 元素的name属性引用类中的属性, column属性引用数据库表中的列。 type属性包含hibernate映射类型,这种映射类型将从Java转换为SQL数据类型。
这是使用
它使用
它使用元素映射,并使用java.util.ArrayList初始化。
它使用
它使用
这是使用 sort属性可以设置为比较器或自然排序。
多对一关联是最常见的关联类型,其中Object可以与多个对象相关联。 例如,相同的地址对象可以与多个雇员对象相关联。
一对一关联类似于多对一关联,不同之处在于该列将被设置为唯一。 例如,地址对象可以与单个雇员对象相关联。
在一对多映射关联中,对象可以与多个对象相关联。 例如,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 ?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。