1. 程式人生 > >Hibernate常見面試題,讓你不再懼怕面試

Hibernate常見面試題,讓你不再懼怕面試

1、get()和load() 的區別 1) 傳送sql的時機: load是延遲載入 get是立即載入; 2) 執行出錯後, get方法拋異常為NullPointException,返回的是null,此null是一個真實的物件。而load方法報ObjectNotFoundException,它返回的是一個代理物件。 3) get會先查一級快取, 再查二級快取,然後查資料庫;load會先查一級快取,如果沒有找到,就建立代理物件, 等需要的時候去查詢二級快取和資料庫。

2、hibernate的一級快取是什麼? hibernate的一級快取也就是session級別的快取。在session介面的實現中包含了一系列的Java集合,這些Java集合構成了session快取。只要session例項沒有結束生命週期,存放在它快取中的物件也不會結束生命週期。

3、Hibernate工作原理及為什麼要用? 原理: 1).讀取並解析配置檔案 2).讀取並解析對映資訊,建立SessionFactory 3).開啟Sesssion 4).建立事務Transation 5).持久化操作 6).提交事務 7).關閉Session 8).關閉SesstionFactory 為什麼要用: .對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。 .Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的 ORM實現。他很大程度的簡化DAO層的編碼工作 .hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。 .hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

4、inverse的好處 在關聯關係中用inverse在控制由哪一端來控制關聯關係。這樣做有什麼好處呢?舉customer和order的例子來說。他們是一對多的關係,如果只單向關聯,且由customer控制關聯關係,則如果我想新增一個order,則先取customer, 然後getOrders得到所有的order集合,然後往集合裡面多加入一個order,然後save(customer), 這樣開銷太大。 如果改雙向關聯且由order主控關係,則如果想為customer增加一個order, 則new一個order,然後給order設定customer,然後save(order)即可。

5、如何優化hibernate 使用雙向一對多關聯,不使用單向一對多 靈活使用單向一對多關聯 不用一對一,用多對一取代 配置物件快取,不使用集合快取 一對多集合使用Bag,多對多集合使用Set 繼承類使用顯式多型 表字段要少,表關聯不要怕多,有二級快取撐腰 6、刷出快取與重新整理快取 刷出快取: session能夠在某些時間點,按照快取中物件的變化來執行相關的sql語句,來同步更新資料庫 重新整理快取:讓session中的資料與資料庫中的資料保持一致