1. 程式人生 > >hibernate框架學習心得(一)

hibernate框架學習心得(一)

反覆地把hibernate的內容學習了兩遍,有了一點感覺,就把心得體會記錄在這裡,以備今後複習。

一、基本知識

hibernate是一個ormapping的框架(object-relation-mapping),也就是用於建立物件與資料庫表之間關係的一個框架,它的優點在於:(1)操作簡單;(2)比較牛的快取機制:一級快取、二級快取、查詢快取;(3)移植性比較好,而缺點是:(1)由於它可以看作是對JDBC的一層封裝,因此hibernate具體發出怎樣的SQL語句其實程式設計師是無法控制的,這樣帶來的一個問題就是很有可能框架發出的SQL語句並不能達到比較令人滿意的效率,因此,如何發出儘量少的SQL語句就成為操作hibernate框架的程式設計師在提升效率的時候需要考慮的問題;(2)當資料量非常非常大的時候,用hibernate就會力不從心了。
使用hibernate的時候需要做四件事情,第一,寫配置檔案hibernate.cfg.xml,這個配置檔案負責建立與資料庫的連線,因此我們會發現在這裡面儲存的都是當前應用使用的資料庫的相關資訊;第二,寫持久化類,所謂持久化類,可以認為是javaweb中的javabean,它用來和資料庫中的表對應;第三,寫對映檔案*.hbm.xml,這個xml檔案描述了持久化類中的屬性和資料庫表中的欄位的對應關係;第四,一定要記得在配置檔案中註冊持久化類哦,例如:

<mapping resource="com/tt/hibernate/domain/Student.hbm.xml" />

二、物件的狀態

對於hibernate中的一個持久化類,都會處在如下三個狀態中的一個:臨時狀態、持久化狀態、脫管狀態。當我們new出一個物件的時候,這個物件是處在臨時狀態,當呼叫session.save()/session.update()/session.get()方法的時候,則變為持久化狀態,最後,當我們關閉session的時候,即呼叫session.close(),或者使用session.clear()/session.evict()清空快取的時候,則物件變為脫管狀態。

三、關係操作

用過關係型資料庫我們都會知道,在資料庫表的設計當中涉及到一對多、多對多等多表設計的問題,在hibernate中同樣存在這個現象,但是在hibernate中多表設計是通過面向物件的思想來體現的。
一對多:按照關係型資料庫的設計思想,一對多的設計應該通過多的一方建立關係,如班級表和學生表就是一對多的關係,那麼我們就可以在學生表中儲存每個學生的班級資訊,然而在hibernate中不是這樣的,它會在班級類中設定一個set,用來存放該班級中的所有學生,查詢的時候則通過班級來找到該班級中的學生
多對多:在關係型資料庫中通過維護第三方表來維護兩表之間的關係,在hibernate中則在兩個類中都儲存對方的set,如課程表和學生表,則在課程類裡儲存型別為學生的set集合,在學生類裡儲存型別為課程的set集合。

四、session

(1)session的產生

在hibernate中,session的產生方式有兩種,分別是:sessionFactory.openSession和sessionFactory.getCurrentSession,對於sessionFactory.openSession來說,每次呼叫都會建立一個新的session,而出於安全性的考慮我們通常會使用第二種方式來呼叫session,當我們呼叫sessionFactory.getCurrentSession方法時,框架首先會判斷當前執行緒中是否有session,若有,則直接取出現成的session供使用,若沒有,則會建立一個新的session,並將其加入到當前threadlocal中去,使用者從threadlocal中獲取並使用。
sessionFactory.getCurrentSession的使用方法:
1、在hibernate的配置檔案中配置如下:

     <propertyname="current_session_context_class">
         thread
     </property>

2、不需要寫session.close方法,在事務提交的時候會自動關閉(由hibernate內部完成)
3、crud都需要事務
1、因為是一個執行緒,所以整個方法中只有一個session和一個事務
2、保證了整個業務操作的安全性

(2)session的快取(一級快取)

1、生命週期就是session的生命週期
2、一級快取存放的資料都是私有資料
把session存放在threadlocal中,不同的執行緒是不能訪問的,所以保證了資料的安全性
3、怎麼樣把資料存放到一級快取中
利用session.save/update/load/get方法都可以存放在一級快取中
4、利用session.get/load方法可以把資料從一級快取中取出
5、session.evict方法可以把一個物件從一級快取中清空
6、利用session.clear方法可以把session中的所有的資料清空
7、利用session.Refresh方法把資料庫中的資料同步到快取中
8、session.flush
在session的快取內部,會去檢查所有的持久化物件
1、如果一個持久化物件沒有ID值,則會發出insert語句
2、如果一個持久化物件有ID值,則會去檢查快照進行對比,如果一樣,則什麼都不做,如果不一樣,則發出update語句
3、檢查所有的持久化物件是否有關聯物件
檢查關聯物件的級聯操作
檢查關聯物件的關係操作
(注:session.flush只會將快取中的資料儲存到資料庫中,而不會清空快取)
9、批量操作