A.概念java
持久化:將內存中的對象持久化(存儲)到數據庫的過程。Hibernate就是持久化的框架。mysql
持久化類:一個普通java對象與數據庫的表創建了映射關係,那麼這個類在Hiberna中被稱爲持久化類。(通俗一點就是java類+映射文件)sql
B.持久化類的編寫規則數據庫
1.對持久化類提供一個無參構造方法。編程
固然,若是你什麼構造都不寫,默認仍是有無參的。提供無參構造是爲了Hibernate底層能反射生成該持久化類的實例。緩存
2.屬性須要私有,對私有屬性提供public的get和set方法。session
因爲底層建立了該持久化類的實例,Hibernate就要開始設置屬性的值多線程
3.對持久化類提供一個惟一標識的OID,與數據庫主鍵對應。oracle
java中經過對象地址值是否相同區分是不是同一個對象,數據庫中經過主鍵肯定是不是同一個記錄。而在Hibernate中經過持久化類的OID屬性來區分是不是同一對象框架
4.持久化類的屬性儘可能使用包裝類類型。
好比基本數據類型如int,若是是0的話,多是默認,也多是數值,而改爲包裝類型的話,默認爲空,0是數值等等
5.持久化類不要使用final進行修飾。
首先,用final修飾的類不能繼承,而Hibernate中則有一個優化手段(延遲加載),經過返回一個代理對象來管理數據,Hibernate引入的javasist的jar包能夠對沒有實現接口的類產生代理,主要就是經過繼承這個類來實現代理,若是不能被繼承,延遲加載技術就失效,load和get方法就沒區別了
C.主鍵生成策略
1.概念:
在實際開發中,通常不容許用戶手動設置數據庫的主鍵(統一規範),因此將主鍵交給數據庫,手動編程設置。Hibernate中爲了減小程序的編寫,提供了不少的主鍵生成策略
2.主鍵的分類
通常用後面的代理主鍵。一旦天然主鍵參與業務邏輯編碼中,後期變更可能須要修改源碼。
3.Hibernate中的主要生成策略
D.持久化類的三種狀態。
Hibernate爲了更好的管理持久化類。將持久化類分爲三種狀態
1.瞬時態(transient)
對象沒有惟一的標識OID,沒有session管理。
獲取:
Customer customer = new Customer()//對象剛開始建立,沒有被賦值標識OID
狀態轉化:
瞬時——>持久 save() saveOrUpdate(Object obj)
瞬時——>脫管 customer.setId(1L);
2.持久態(presistent)
對象有惟一的標識OID。有session管理
得到:get() load()
狀態轉化:
持久——>瞬時:delete()
持久——>脫管 close(),clear() evict()(清除單個對象)
3.脫管態(Detached)
對象有惟一的標識OID,沒有被session管理
獲取:(官網沒有給如何直接獲取,可是能夠獲取)
Customer customer = new Customer(); customer.setId(1L);
狀態轉化:
脫管——>持久: update() saveOrUpdate()
脫管——>瞬時 setId(null);
持久化對象的特性:
自動跟新數據庫:
給持久化對象設置新的屬性,先用get獲取,再設置值,不用update,只要事務提交,也能更新數據庫
原理:Hibernate有一級緩存,會備份一份數據在Hibernate的快照區,當你在內存中改變持久化對象裏面的屬性值時候,會在提交後自動和快照區對比,不同,更新數據庫和快照區。(只有當你設置的值和數據庫裏面不一致的時候才自動更新)
Customer cust = session.get(Customer.class,1L); cust.setName("張三"); tx.commit()