这是有关Hibernate Framework的一些最重要问题的摘要,可能会要求您在访谈中回答! 您无需担心下一次面试的机会,因为Java Code Geeks在这里为您服务!
您可能会被问到的大多数事情都收集在下面的列表中。 我们的Hibernate面试问题将带您了解完整的Hibernate框架,并使用问题和答案提供对该框架的透彻了解。 对问题进行了分类,以根据需要提供特定于每个模块的信息。 有了这些Hibernate面试问题,我们确保您不再需要担心与Hibernate框架相关的面试。
问题与解答始于框架及其概念的介绍。 它们扩展到配置,用法和概念。 为了更深入,我们涵盖了有关缓存级别和与缓存有关的配置的问题。 这些问题以对各种休眠特定功能的解释作为结束,这些功能使您的编程更加容易。
让我们开始介绍部分。
目录
- 休眠基础
- 配置Hibernate框架
- 休眠缓存和实现
休眠基础
1.什么是ORM?
Java是一种面向对象的编程语言。 在Java中,我们几乎将每个现实世界的实体映射到一个对象中。 ORM是对象关系模型的缩写。 ORM是Hibernate框架背后的基本概念。 ORM是将数据库表映射到Java类或Java对象的过程。 数据库中的每一列都映射到Java中的不同变量。 因此,ORM帮助我们简化了与Java中的数据库交互的过程。
2.什么是Hibernate框架?
Hibernate框架是一组Java类,旨在简化数据库连接和交互过程。 Hibernate框架提供了数据库和Java代码之间的中间代码层。 该层简化了数据库,连接池,查询执行以及缓存的配置。 Hibernate使开发人员可以在很大程度上不受数据库更改的影响。
3.什么是方言?
方言是一组代码文件或一个文件,有时会定义将数据库连接到Java类的过程。 Hibernate中的一种方言起着理解与基础数据库之间发生的通信的作用。 每当基础数据库更改时,在Hibernate配置中只需更改方言和数据库凭据即可。 只要代码使用HQL查询,便是如此。
4.什么是HQL查询?
HQL是Hibernate查询语言的缩写。 HQL是一种独立于数据库编写查询的简单方法。 Hibernate框架可以理解HQL查询。 根据所使用的数据库方言,它们会转换为普通的SQL查询。 通常,在没有休眠框架的情况下,更改基础数据库的过程涉及所有查询的更改。 使用Hibernate框架,如果代码使用HQL查询,则更改基础数据库的过程非常简单。 所需要做的就是更改方言和数据库凭据,其余部分由框架负责。
5.配置Hibernate框架的可能方法是什么?
可以使用XML以及Java类注释来配置休眠框架。 但是,仅从Hibernate 4.0中引入了基于Java类的注释功能。 因此,任何较低的版本仅支持基于XML的配置。
6.什么是连接池?
在企业应用程序中,该应用程序将受到众多用户的攻击。 如果应用程序服务器为每个请求建立一个新的连接,则将对数据库服务器造成负担。 另一方面,如果仅存在一个数据库连接,则查询请求的开销将很大。 因此,最好在Hibernate中预先配置数量有限的数据库连接。 Hibernate框架可确保建立新的连接,直到达到定义的最大限制。 发布限制后,Hibernate重用数据库连接对象。 因此,Hibernate连接池是为管理与数据库的并行通信而创建的一堆数据库连接对象。
7.什么是JPA?
JPA是Java持久性API的首字母缩写。 Java的该API在Java中提供了某些预定义的注释,这使数据库ORM更加简单。 您需要做的就是将这些注释放在类名和变量上方,以将它们映射到数据库表。
8. JPA如何在Hibernate框架中提供帮助?
在JPA作为ORM标准发布并接受之前,Hibernate使用XML映射将休眠的Value对象严格绑定到Database对象。 该映射基于XML,因此容易出现高错误,并且在配置映射时需要付出更多的努力。 使用JPA,Hibernate通过启用对JPA批注的扫描来简化映射过程。 这些注释消除了将XML用于映射的需要。
9.与JDBC相比,使用Hibernate有什么优势?
JDBC – Java数据库连接是标准的数据库连接API,它需要数据库驱动程序代码和每个数据库的单独数据库连接代码。 JDBC仅理解标准SQL查询。 借助Hibernate框架,数据库驱动程序已预先加载。 每次更改数据库时,无需下载其他驱动程序。 此外,Hibernate支持SQL以及HQL。 如果开发人员使用HQL,则Hibernate会使用已配置的方言来为基础数据库准备SQL查询。 此外,Hibernate还提供具有多种配置的托管缓存。
10. Hibernate提供哪些重要接口?
使用以下重要接口进行休眠。
会话(org.hibernate.Session)
Session
是为Java应用程序与数据库持久性存储之间的通信周期而创建的单线程且短暂的对象。 它是JDBC java.sql.Connection
类的包装,并且用作org.hibernate.Transaction
的工厂。 仅在必要时才创建实现此接口的类的实例,并在我们使用完该接口后立即销毁它。 该对象提供Java核心和CRUD操作的休眠框架之间的接口。
SessionFactory(org.hibernate.SessionFactory)
顾名思义,此接口管理提供用于创建和销毁Session对象的功能签名。 实现SessionFactory的类具有不变的线程安全缓存,该缓存被维护以管理会话。 此外,它还维护了预编译数据库映射的缓存,以确保更快的数据库操作。
交易(org.hibernate.Transaction)
顾名思义,事务是一个接口,其中包含用于管理数据库交互的功能定义。 事务是一个短暂的线程,负责从Java应用程序中获取数据并以查询的形式将其传递到数据库。 事务类似于在每个数据库事务之后都会销毁的会话。
配置Hibernate框架
11. Hibernate框架涉及哪些配置?
Hibernate框架是一个庞大的框架,旨在为您处理几乎所有数据库操作。 配置这样的框架涉及要配置的多个实体。 这些包括:
- 数据库凭证
- 数据库方言
- 数据库URL
- 缓存级别
- ORM映射
- 连接池配置
- 表创建模式–创建/更新
Hibernate几乎为每个非数据库配置都提供了默认值,例如连接池大小,缓存级别,表创建模式等。 因此,尽管具有许多可配置的方面,但它允许以最少的配置开始。
12.什么是Hibernate配置文件?
Hibernate配置文件包括使用Hibernate框架开始数据库连接所需的特定于数据库的配置。 该配置文件通常是一个名为hibernate.cfg.xml的XML文档。 如果您希望使用基于Java的配置,则需要创建一个类似于以下所示的属性文件。
################### JDBC Configuration ##########################
jdbc.driverClassName=org.mysql.jdbcDriver
jdbc.url=jdbc:mysql://localhost:3306/mydb;shutdown=true
jdbc.username=root
jdbc.password=xxxxxx################### Hibernate Configuration ##########################
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
hibernate.generate_statistics=true
该文件可以使用任何名称。 但是,有必要使用此文件名在Java文件中加载此配置。 下面显示了在Java配置中加载属性文件的示例代码。
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.ClassPathResource;@Import({RepositoryConfig.class})
@Configuration
public class AppConfig
{//@Beanpublic PropertyPlaceholderConfigurer getPropertyPlaceholderConfigurer(){PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();ppc.setLocation(new ClassPathResource("hibernate.properties"));ppc.setIgnoreUnresolvablePlaceholders(true);return ppc;}
}
可以注意到,在基于Java的配置中,类代码也包含一些Spring框架类。 因此,该示例属于Hibernate与Spring的集成。 请仔细注意此处的注释。 这些注释定义该类带有休眠配置。
13. Hibernate如何创建数据库连接?
Hibernate读取配置的方言来确定要使用的驱动程序jar。 Hibernate预先打包了数据库驱动程序jar。 这些jar与用于使用JDBC连接到数据库的jar相同。 基于方言,Hibernate动态注册各自的驱动程序类,并使用URL和凭据在后端使用JDBC通过数据库连接到数据库。
14.配置对象表映射的可能方法是什么?
在Hibernate中,有两种可能的方法来配置映射。 两种方法之一是创建一个XML文件,该文件定义了数据库列和类变量之间的映射。 该XML被称为映射XML。 每个这样的XML的条目都需要在hibernate.cfg.xml中完成,以确保Hibernate识别并预编译这些绑定。
配置bean的另一种方法是使用带注释的Java类进行映射。 只要在hibernate.cfg.xml中指定了文件夹的路径,就会自动扫描带注释的Java类。
15.使用哪个注释将一个类声明为休眠bean?
注释@Entity
用于将类声明为实体。 一个简单的例子如下所示。
@Entity
@Table(name="users")
public class User{
String username;
String password;
}
16.如何指定使用注释链接到实体的表名?
从上面的代码可以看出,注解@Table
用于指定链接到该实体的数据库表名称。该实体需要一个强制属性name
,该属性name
指定数据库中的表名称。
17.实体中的变量如何连接到数据库列?
默认情况下,Hibernate在类中查找与变量名匹配的列名。 但是,也可以指定不同的变量名并将它们绑定到数据库中的相应列。
18.我们如何为变量映射指定其他列名?
注释@Column
用于定义与变量关联的列名。 在没有此注释的情况下,Hibernate会预先编译映射到具有相同名称的列的变量的映射。 下面显示了使用此注释的示例:
@Entity
@Table(name="users")
public class User{
@Column(name="user_name")
String username;
String password;
}
name
属性是必填属性,用于指定与变量名称不同的列名称。 从上面的代码可以理解,列user_name绑定到变量username
19.我们如何指定一个变量作为表的主键?
Hibernate能够直接基于Java代码中提供的映射为应用程序创建数据库表。 在这种情况下,Hibernate需要知道哪些列应该是主键。 可以使用@Id
注释进行配置。 Hibernate不仅负责将此列创建为主键列,而且还在每次数据库插入和更新期间验证其唯一约束。
20.我们如何定义主键值生成逻辑?
可以根据数据库使用各种方法来生成主键值。 例如,在MySQL数据库中,可以使用自动递增算法生成主键,而在Oracle数据库中,您需要创建一个序列并将其用于自动递增主键的值。 可以使用下面的注释代码指定这些生成方法。
@Entity
@Table(name="users")
public class User{@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
int userid;@Column(name="user_name")
String username;String password;
}
这里的userid列已定义为使用身份策略自动生成的主键。 strategy
的可能值包括:
- GenerationType.AUTO
- GenerationType.IDENTITY
- GenerationType.SEQUENCE
- GenerationType.TABLE
21.如何在hibernate.cfg.xml中配置方言?
在xml中配置方言涉及定义名称为hibernate.dialect的属性。 下面显示了用于定义方言的样本XML标签:
<property name="org.hibernate.dialect.MySQLDialect">
org.hibernate.dialect.MySQLDialect
</property>
22.如何在hibernate.cfg.xml中配置数据库URL和凭证?
可以使用各种属性值来配置Hibernate框架。 在上述问题中,我们讨论了如何使用属性文件配置框架。 XML中的配置非常相似。 我们只需要使用与上面的属性文件中指定的名称相似的名称来创建相应的属性标签。 下面提供了配置数据库URL和凭据的示例。
<property name = "hibernate.connection.url">jdbc:mysql://localhost/mydb</property><property name = "hibernate.connection.username">root</property><property name = "hibernate.connection.password">password</property>
在执行Java应用程序时,Hibernate框架会预编译代码以连接到数据库,并创建一个连接池以减少查询执行期间数据库连接的开销。
23.如何配置连接池大小?
Hibernate中的连接池大小有两个值-最小池大小和最大池大小。 可以使用属性hibernate.c3p0.min_size
和hibernate.c3p0.max_size
来配置这些大小。 可以按照与上述数据库凭据所示相同的方式配置这些属性。
24.如何为Hibernate bean配置文件夹扫描?
Hibernate文件夹扫描是Spring支持的功能。 Spring框架提供了扫描文件夹并以休眠Bean形式准备映射的支持,而无需创建休眠映射xml。 要使用Spring框架和Hibernate配置要扫描的文件夹,请使用以下代码:
<bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"p:dataSource-ref="dataSource"p:configLocation="WEB-INF/classes/hibernate.cfg.xml"p:packagesToScan="com.example.model"
/>
24.如何在没有Spring框架的情况下配置休眠bean?
在没有Spring框架的情况下,bean的配置使用相应的映射xml文件完成。 这些XML文件需要添加到hibernate配置xml中,以便hibernate能够检测到它们。 还可以配置框架,使其扫描XML条目。 下面的代码演示了如何配置休眠模式以扫描bean配置文件。
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name = "hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name = "hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- Assume test is the database name --><property name = "hibernate.connection.url">jdbc:mysql://localhost/test</property><property name = "hibernate.connection.username">root</property><property name = "hibernate.connection.password">root123</property><!-- List of XML mapping files --><mapping resource = "User.hbm.xml"/></session-factory>
</hibernate-configuration>
在上面的代码中,映射部分指示User类的bean的休眠映射文件路径。
休眠缓存和实现
缓存是企业级应用程序每天处理数千个请求所必需的一项重要功能。 Hibernate框架固有地认为在各个级别缓存查询输出。 这些缓存级别可配置为最适合您的需求。 缓存级别分为三种:
- 会话级别缓存:会话级别缓存由Hibernate作为默认缓存级别实现。 此缓存的功能是缓存会话中的对象。 这些缓存的对象驻留在会话内存本身中。
- 二级缓存:二级缓存负责跨会话缓存对象。 启用第二级缓存后,首先在缓存中搜索对象,然后,如果找不到,将执行数据库查询以搜索对象。 每当使用对象的主键加载对象时,将使用二级缓存。 二级缓存对象还获取它们各自的关联,并驻留在会话以外的单独的内存堆栈中。
- 查询缓存:问题缓存用于存储查询的后效。 在打开查询缓存时,查询的输出将与激发的查询和参数放在一起。 每次释放查询时,存储框架都会检查参数和查询的混合情况。 如果在缓存中找到结果,则将其返回,通常会启动数据库事务。 显而易见,在具有各种参数的情况下保留查询绝非明智之举,因为从那时起,单独的参数可能具有各种性质。 对于这些混合中的每一种,结果都将保存在内存中。 这会导致更大的内存利用率。
25.如何配置Hibernate二级缓存?
可以使用EHCache库配置休眠二级缓存。 要使用maven添加EHCache依赖关系,请使用以下依赖关系代码。
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-ehcache</artifactId><version>4.3.5.Final</version>
</dependency>
添加该库后,需要将休眠框架配置为使用该库进行缓存。 为了使用EHCache配置第二级缓存,请使用以下代码。
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="net.sf.ehcache.configurationResourceName">/myehcache.xml</property>
26.实体bean的不同状态是什么?
可能存在的元素bean是这三种状态之一。
瞬态 :当一个对象永不连续或与任何会话相关时,它处于瞬态状态。 通过调用save()
, persist()
或saveOrUpdate()
可能会影响瞬态情况。 稳定的示例可能会通过调用delete()来影响瞬态。
持续性 :当一个问题与某类会话相关时,它处于坚持不懈的状态。 由get()
或load()
技术返回的任何事件都是持久的。
分离 :当一个对象已经无情但与任何会话无关时,它处于分离状态。 通过调用refresh()
, saveOrUpdate()
, lock()
或replicate()
可以确定脱离的场合。 通过调用merge()
可以将瞬态或脱开示例的条件作为另一种恒定情况同样地无情地影响。
27. Session.beginTransaction()的用途是什么?
在Hibernate中,每次数据交换都是使用事务维护的。 每当要开始新的数据交换时,都会调用Session.beginTransaction
函数来启动事务。
28.如何在Hibernate中完成交易?
为了在休眠状态下完成事务,可以执行两个操作:
- 承诺
- 回滚
每当提交事务时,数据交换都会写入数据库。 如果发生回滚,事务数据将被刷新,并且永远不会写入或更新到数据库中。
29.我们如何在Hibernate中提交事务?
Hibernate中的事务对象可以被提交或回滚。 为了执行此操作,我们利用以下代码。
tx = Session.beginTransaction();
...
...
...
//Do something with transaction
...
...
...
tx.commit();
可以看出,函数调用tx.commit()
完成了将事务提交到数据库的任务。 对于回滚,过程保持不变。 您需要做的就是将函数调用更改为tx.rollback()
。
30. Hibernate映射提供哪些不同类型的关系?
可以在休眠中实现三种不同类型的关系。 他们是:
- 一对一映射
- 一对多映射
- 多对多映射
31.哪个注释用于定义Java文件中的映射?
为了在Java文件中定义映射,可以根据需要使用三种不同的注释。 注释是:
-
@OneToOne
-
@ManyToOne
-
@OneToMany
注释的用法非常清楚。 注释需要一个强制性属性mappedBy
来标识相关表。
32.什么是Hibernate Session?如何获取它?
Hibernate Session是Java代码层和hibernate框架之间的接口。 它是用于处理数据库事务的核心接口。 会话的生命周期从事务的开始开始,直到事务结束。
从JPA 2.0开始,可以使用以下使用EntityManager
代码获取Session
对象
SessionFactory sessionFactory = entityManager.getEntityManagerFactory().unwrap(SessionFactory.class);
33.是否可以使用Hibernate在单个Java应用程序中连接多个数据库?
是。 实际上,可以使用两个单独的休眠配置文件和两个单独的会话工厂将单个Java应用程序连接到多个数据库。 这些休眠配置文件包含与各自数据库有关的不同方言配置。 实体专门映射到相关的数据库配置。 因此,使用两个不同的并行SessionFactory对象,可以连接多个数据库。
34.什么是Hibernate中的Criteria查询?
Hibernate中的条件查询是一个复杂的休眠查询,它使开发人员可以指定多个条件以使用后端中的休眠查询从数据库中获取数据。 使用Criteria
对象创建条件查询。 以后将此标准对象与限制条件组合起来以得到最终结果。 下面的代码演示了一个简单的条件查询执行:
Criteria cr = session.createCriteria(User.class);
cr.add(Restrictions.eq("user_name", datsabk));
List results = cr.list();
上面的查询获取具有username属性的值datsabk的用户列表。 因此,Criteria类提供了必要的实现,以简化使用对象的复杂查询。
35.什么是Hibernate中的延迟加载?
如上所述,可以使用Hibernate中的注释将实体与其他实体映射。 当您获取此类实体时,hibernate能够以两种方式加载关联的实体。 其中之一是将它们与父实体一起加载。 由于涉及的记录的连接和增加,这通常很耗时。
另一种加载方式称为延迟加载方式。 延迟加载意味着Hibernate仅在您实际尝试访问关联的实体值时才加载关联的实体。 这不仅可以节省运行时内存,而且可以加快查询速度。
36.会话对象的load()方法是什么?
此方法用于加载代理对象,而无需实际访问数据库。 因此,它将命中保存到数据库中并从缓存中加载数据。 这是一种告诉休眠从缓存中选择数据的明确方法。
37. Hibernate Session对象是线程安全的吗?
Hibernate会话对象是一个全局对象,用于管理与数据库的会话。 可以跨线程传递该对象以交换数据。 因此,它可以同时被多个线程消耗。 因此,它不是线程安全的对象。
38. Hibernate是否支持多态?
是。 Hibernate本质上支持多态。 Hibernate类主要通过多态性本身来支持其操作。
39.一个应用程序在任何时间点都存在多少个Hibernate会话?
休眠会话是一个共享对象。 在任何时间点,仅存在一个共享的会话对象,该对象有助于管理事务并从连接池获取连接。 必须注意,仅当使用单个数据库配置时,这才是正确的。 在有多个数据库配置的情况下,Hibernate将创建一个单独的会话对象以维护其他数据库的映射和事务。
结论
这是Hibernate框架中使用的一些最重要的概念和术语的摘要。 回答这些问题的目的是使您准备好面试。 它们捕获了所有重要概念,包括休眠框架的配置,缓存和实现。 然而,总是有更多的探索。
好的,现在您可以开始面试了! 不要忘记查看我们的示例专用小节 !
如果您喜欢此功能,请订阅我们的时事通讯,以享受每周更新和免费白皮书! 另外,请查看我们的课程以获得更高级的培训!
欢迎您提出您的意见,我们会将其纳入本文!
翻译自: https://www.javacodegeeks.com/2018/08/hibernate-interview-questions-answers-ultimate-list.html