整理 15 道涵蓋 ORM 映射、Session 操作、關聯映射、檢索策略、事務隔離、鎖機制等核心知識點的 Hibernate 面試題,附帶答案與解析。
題目與答案
- 關系數據模型與對象模型匹配關系(多選)
A) 表對應類 B) 記錄對應對象 C) 字段對應屬性 D) 表引用關系對應類依賴關系
答案:A、B、C(D 錯誤:表引用關系對應類關聯關系,非依賴)
- SessionFactory 說法正確的(多選)
A) 每個數據庫事務創建一個 B) 一個對應一個數據源 C) 重量級,單數據源只需一個 D) load() 用於加載持久化對象
答案:B、C(A 錯誤:SessionFactory 應單例;D 錯誤:load() 是 Session 方法)
- Customer.orders (Set) 映射元素
答案:A) <set>
- 級聯保存集合對象的 cascade 值
A) none B) save C) delete D) save-update
答案:D
- Session 方法有哪些(多選)
A) load() B) save() C) delete() D) update() E) open() F) close()
答案:A、B、C、D、F(E 是 SessionFactory 方法)
- 同一 Session 兩次 load 同 ID 對象比較結果
答案:C) true(Session 緩存保證同一 ID 返回同一實例)
- 同一事務中修改同一屬性兩次,提交幾條 update
答案:B) 1(Hibernate 合併同一事務內對同一對象的多次修改)
- 持久化層對象狀態(多選)
A) 臨時/瞬時 B) 獨立 C) 游離/脫管 D) 持久化
答案:A、C、D(標準術語:Transient、Detached、Persistent)
- 對象第幾行變為持久化狀態
Customer c=new Customer(); //1
c.setName("Tom"); //2
Session s=sf.openSession(); //3
Transaction tx=s.beginTransaction(); //4
s.save(c); //4
tx.commit(); //5
s.close(); //6
答案:D) line4(save() 瞬間進入持久化狀態)
- 對象第幾行變為游離狀態
答案:F) line6(session.close() 瞬間脫管)
- 利用外連結查詢的檢索策略
A) 立即檢索 B) 延遲檢索 C) 迫切左外連結檢索
答案:C
- 延遲檢索集合,Session 關閉後遍歷會怎樣
答案:C) 編譯通過,運行時拋出異常(LazyInitializationException,無 Session 無法初始化代理)
- HQL 與 SQL 比較(多選)
A) 沒差別 B) HQL 面向對象,SQL 操作關系庫 C) 都包含 DML D) HQL 僅查詢
答案:B、D(HQL 支持 bulk update/delete,但不支持 insert)
- 事務隔離級別由誰實現
A) Java 應用 B) Hibernate C) 數據庫系統 D) JDBC 驅動
答案:C(隔離級別是數據庫特性,Hibernate 僅傳遞設置)
- 悲觀鎖 vs 樂觀鎖並發性能
A) 悲觀鎖 B) 樂觀鎖
答案:B(樂觀鎖無鎖開銷,衝突少時性能優)
核心知識點總結
- Session 緩存(一級緩存)保證同一 Session 內同一 ID 對象唯一
- Hibernate 自動髒檢查合併同一事務內的多次修改
- 對象三大狀態:Transient(瞬時)、Persistent(持久化)、Detached(游離)
- 延遲加載需在 Session 開啟期間訪問,否則拋出 LazyInitializationException
- 事務隔離級別由數據庫實現,Hibernate 僅委託 JDBC 設置