1. 程式人生 > >撩課-Java每天5道面試題第14天

撩課-Java每天5道面試題第14天

101.請解釋下 ORM?

物件關係對映(Object Relational Mapping)模式
是一種為了解決面向物件與關係資料庫
存在的互不匹配的現象的技術。
簡單來說,
ORM是通過使用描述物件和資料庫之間對映的元資料,
將程式中的物件自動持久化到關係資料庫中。

傳統如何實現持久化:
1、採用硬編碼方式,
為每一種可能的資料庫訪問
操作提供單獨的方法,
2、ORM提供了對資料庫的對映,
不用sql直接編碼,
能夠像操作物件一樣從資料庫獲得資料。

ORM核心原則:

1、簡單:
以最基本的形式建模資料。

2、傳達性:
資料庫結構被任何人都能理解的語言文件化。

3、精確性:
基於資料庫模型建立正確標準化的結構。

ORM技術特點:
1、提高開發效率。 由於可以自動對entity物件與資料庫中的table 進行欄位與屬性的對映, 所以我們實際可能已經不需要一個專用的、 龐大的資料訪問層。 ORM缺點: 使用ORM所生成的程式碼 一般不太可能寫出很高效的演算法, 效能會受影響。

 

102.Hibernate 與 JPA 區別在哪?

在討論Hibernate與Jpa的關係是,
首先要明確Jpa的用途。
JPA全稱為Java Persistence API ,
Java持久化API是Sun公司在Java EE 5規範中
提出的Java持久化介面。
JPA吸取了目前Java持久化技術的優點,
旨在規範、簡化Java物件的持久化工作。
使用JPA持久化物件,
並不是依賴於某一個ORM框架。
與Jpa相關的就是這個ORM技術,
ORM 是Object
-Relation-Mapping, 即物件關係影射技術, 是物件持久化的核心。O RM是對JDBC的封裝, 從而解決了JDBC的各種存在問題: 知道Jpa是一種規範, 而Hibernate是它的一種實現。 除了Hibernate, 還有EclipseLink(曾經的toplink), OpenJPA等可供選擇, 所以使用Jpa的一個好處是, 可以更換實現而不必改動太多程式碼。

 

103.什麼是懶載入(Lazy Loading)?

 1. 懶載入顧名思義就是延遲載入。
即當兩個及以上表
使用Hibernate來管理級聯關係時,
一個表被載入到JVM記憶體中,
而其他表會被暫存在資料庫的快取中,
當需要使用相關表資料的時候
再載入到JVM記憶體中。
因此通過懶載入機制可以
減少記憶體中不必要的開銷,
以提高程式的效能。
2. 問題描述:當使用懶載入時, 如果將session關閉, 則斷開了與資料庫的連線, 這時如果要訪問字表資料, 由於字表資料存放在資料庫快取中, 而連線已經關閉, 則訪問字表資料時會丟擲LazyInitializationException異常。 解決辦法: 1. 不使用懶載入,將字表配置檔案中的lazy屬性改為false 2.使用過濾器, 把close session操作推遲到得到頁面結果後執行, 這裡可以採用Spring中的OpenSessionViewFilter過濾器來實現 3.手動將需要的字表資料 從資料庫快取載入到jvm記憶體中

 

104.什麼是 N+1 難題?

一般而言說n+1意思是,
無論在一對多還是多對一當查詢出n條資料之後,
每條資料會關聯的查詢1次他的關聯物件,
這就叫做n+1。

本來所有資訊可以一次性查詢出來,
也就是簡單的連表查詢,
但是Hibernate會首先查詢1次得到當前物件,
然後當前物件裡面的n個關聯物件
會再次訪問資料庫n次,
這就是1+n問題。

Hibernate給出了3中解決方案,
1.延遲載入,
當需要的時候才查詢,不
需要就不查詢,
但是感覺這種方式治標不治本,
尤其是在那種報表統計查詢的時候更為明顯。

2.fetch="join",
預設是fetch="select",
這個其實說白了就是一個做外連線,
允許外來鍵為空的情況之下。

3.二級快取,
第一次查詢之後存在記憶體中,
後面的相同查詢就快了。
但是有2個缺點:
二級快取首先是有點浪費記憶體空間,
如果多了的話浪費還比較嚴重,

 

105.簡介下 Hibernate Session 與 SessionFactory。

Session介面負責執行
被持久化物件的CRUD操作
CRUD的任務是完成與資料庫的交流,
包含了很多常見的SQL語句。
需要注意的是,
Session物件是非執行緒安全的,
同時,
Hibernate的Session
不同於JSP應用中的HttpSession。
這裡當使用Session這個術語時,
其實指的是Hibernate中的Session,
而以後會將HttpSession物件
稱為使用者Session。

SessionFactory介面負責初始化Hibernate。
它充當資料儲存源的代理,
並負責建立Session物件。
這裡用到了工廠模式。
需要注意的是,
SessionFactory並不是輕量級的,
因為一般情況下,
一個專案通常只需要
一個SessionFactory就夠,
當需要操作多個數據庫時,
可以為每個資料庫指定
一個SessionFactory。