1、為什么要使用 hibernate?
- 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼
- 基于jdbc的主流持久化框架,是一個優秀的ORM實現,很大程度的簡化了dao層的編碼工作
- 使用java的反射機制
- 性能好,是一個輕量級框架,映射靈活,支持很多關系型數據庫,從一對一到多對多的各種復雜關系
2、什么是 ORM 框架??
ORM(Object Relation Mapping)對象關系映射
通過類與數據庫表的映射關系,將對象持久化到數據庫中
常見的ORM框架有Hibernate、Mybatis、EclipseLink、JFinal
3、hibernate 中如何在控制臺查看打印的 sql 語句?
在 Hibernate 中,可以通過以下幾種方式在控制臺查看打印的 SQL 語句:
-
配置日志級別:在 Hibernate 的配置文件(如
hibernate.cfg.xml
)中,將日志級別設置為DEBUG
或TRACE
。這樣,Hibernate 會在控制臺打印更多詳細的信息,包括執行的 SQL 語句。 -
使用日志框架:將 Hibernate 與日志框架(如 Log4j 或 SLF4J)集成,并在日志配置文件中設置適當的日志級別。這樣可以更靈活地控制日志輸出,并將 SQL 語句打印到指定的日志文件中。
-
開啟 Hibernate 的顯示 SQL 功能:在 Hibernate 的配置文件中,設置
show_sql
屬性為true
。這樣,Hibernate 會在執行 SQL 語句時將其打印到控制臺。 -
使用 Hibernate 的攔截器:編寫自定義的攔截器類,實現
org.hibernate.EmptyInterceptor
接口,并在preFlush
方法中獲取當前執行的 SQL 語句,并將其打印到控制臺。
4、hibernate 有幾種查詢方式?
HQL,QBC(Query By Criteria),原生SQL查詢
5、hibernate 實體類可以被定義為 final 嗎?
可以,但是這種做法不好。因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果把實體類定義成final類之后,因為java不允許對final類進行擴展,所以hibernate就無法再使用代理了,從而影響性能。
6、在 hibernate 中使用 Integer 和 int 做映射有什么區別?
如果使用基本類型變量int,如果數據庫中對應的存儲數據是null,使用PO類進行獲取數據會出現類型轉換異常。
如果使用你的是對象類型Integer則不會報錯。
7、get()和 load()的區別?
get:get方法被調用時會立即發出SQL語句
load:當調用load方法的時候會返回一個目標對象的代理對象,在這個代理對象中只存儲了目標對象的ID值,只有當調用除ID值以外的屬性值的時候才會發出SQL查詢。
8、說一下 hibernate 的緩存機制?
Hibernate 的緩存機制是其性能優化的重要手段之一。Hibernate 的緩存分為一級緩存和二級緩存。
- 一級緩存:也稱為會話級緩存,是 Hibernate 中默認啟用的緩存。它與當前的會話相關聯,存儲了從數據庫中查詢到的對象。當再次訪問同一個對象時,Hibernate 會從一級緩存中獲取,而不是再次查詢數據庫,從而提高了性能。
- 二級緩存:也稱為進程級或應用級緩存,是在一級緩存的基礎上進一步擴展的緩存。它可以在多個會話之間共享緩存的數據,從而減少了對數據庫的訪問次數。Hibernate 提供了多種二級緩存實現,如 Ehcache、Redis 等。
Hibernate 的緩存機制通過以下方式提高性能:
- 減少數據庫訪問次數:通過緩存已經查詢到的對象,避免了重復查詢數據庫,從而減少了數據庫的負載和響應時間。
- 提高數據訪問效率:緩存中的數據可以直接訪問,無需進行數據庫查詢和結果映射,提高了數據訪問的效率。
- 支持事務隔離級別:Hibernate 的緩存可以與數據庫的事務隔離級別配合使用,確保在事務提交之前,緩存中的數據與數據庫中的數據保持一致。
需要注意的是,緩存機制雖然可以提高性能,但也可能帶來一些問題,如緩存一致性、緩存過期等。因此,在使用緩存時,需要根據具體的業務需求和數據訪問模式進行合理的配置和管理。
9、hibernate 是如何工作的?
- 讀取并解析配置
- 讀取并解析映射信息
- 創建Session Factory
- 打開Session
- 創建事務Transaction
- 持久化操作
- 提交事務
- 關閉Session
- 關閉SessionFactory
10、hibernate 對象有哪些狀態?
- Transient(瞬時):對象剛new出來,還沒設ID,設了其他值
- Persistent(持久):調用了save()、saveOrUpdate(),就變成Persistent
- Detached(托管):當session close()完之后,變成Detached
?11、hibernate 實體類必須要有無參構造函數嗎?為什么?
必須,因為hibernate框架會調用這個默認構造方法來構造實例對象。
如果沒有提供任何構造方法,虛擬機會自動提供默認構造方法,如果開發人員提供了其他有參數的構造方法的話,虛擬機就不再提供默認構造方法,這時必須手動把無參構造器寫出來。
12、在 hibernate 中 getCurrentSession 和 openSession 的區別是什么??
openSession:每次使用都是打開一個新的對象,而且使用完需要調用close方法關閉session
getCurrenctSession:如果已經有session,就使用舊的,如果沒有再打開新的。
一般情況下都是使用getCurrenctSession