
- Hibernate 教程
- Hibernate - 首頁
- ORM - 概述
- Hibernate - 概述
- Hibernate - 架構
- Hibernate - 環境
- Hibernate - 配置
- Hibernate - 會話
- Hibernate - 持久化類
- Hibernate - 對映檔案
- Hibernate - 對映型別
- Hibernate - 示例
- Hibernate - O/R 對映
- Hibernate - 級聯型別
- Hibernate - 註解
- Hibernate - 查詢語言
- Hibernate - Criteria 查詢
- Hibernate - 原生 SQL
- Hibernate - 快取
- Hibernate - 實體生命週期
- Hibernate - 批次處理
- Hibernate - 攔截器
- Hibernate - ID 生成器
- Hibernate - 儲存圖片
- Hibernate - log4j 整合
- Hibernate - Spring 整合
- Hibernate - Struts 2 整合
- Hibernate - Web 應用
- 對映表示例
- Hibernate - 基於層次結構的表
- Hibernate - 基於具體類的表
- Hibernate - 基於子類的表
- Hibernate 有用資源
- Hibernate - 問答
- Hibernate - 快速指南
- Hibernate - 有用資源
- Hibernate - 討論
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.properties和hibernate.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 風格定義 getXXX 和 setXXX 方法。
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、sequence 或 hilo 演算法建立 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 祝您面試順利,並祝您未來的工作一切順利。乾杯 :-)