休眠面试问答-最终清单
這是有關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框架固有地認為在各個級別緩存查詢輸出。 這些緩存級別可配置為最適合您的需求。 緩存級別分為三種:
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文件中定義映射,可以根據需要使用三種不同的注釋。 注釋是:
注釋的用法非常清楚。 注釋需要一個強制性屬性mappedBy來標識相關表。
32.什么是Hibernate Session?如何獲取它?
Hibernate Session是Java代碼層和hibernate框架之間的接口。 它是用于處理數據庫事務的核心接口。 會話的生命周期從事務的開始開始,直到事務結束。
從JPA 2.0開始,可以使用以下使用EntityManager代碼獲取Session對象
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
總結
以上是生活随笔為你收集整理的休眠面试问答-最终清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux正则表达式语法(Linux 正
- 下一篇: cglib_cglib:缺少的手册