Hibernate筆記2,hibernate筆記
一.持久化類
1.持久化標識OID
資料庫中叫做主鍵,對應實體的ID屬性即為OID;Hibernate通過OID區分兩個對象是否為同一對象;OID的產生一般交由程式自動處理;
2.持久化類
概念:持久化類為可以操作資料庫的實體類;
持久化類 = 實體類 + 對應檔(實體類名.hbm.xml)
3.編寫規則:
(1).類需使用public修飾;
(2).實現序列化介面;(public class User implements Serializable{....})
(3).類不能使用final修飾,否則無法構造代理對象;
(4).屬性需使用private修飾,並提供public修飾的getter/setter方法;
(5).需添加OID屬性;
(6).使用封裝類(Long,Double,Integer,Character...)修飾屬性
(7).無參構造需使用public修飾,便於通過反射建立對象;
4.三種狀態:
區分要點:(1)是否存在OID;(2)是否被session管理;
i.瞬時態:無ID,無session;
ii.持久態:有ID,有session;該狀態的對象在屬性發生變化時,自動更新資料庫,而不用調用update方法;
iii.游離態(脫管態):有ID,無session;
二.主鍵(OID)建置原則
1.分類:
自然主鍵:把具有業務含義的欄位作為主鍵;弊端是實際業務中該欄位有可能重複,一旦重複就要修改模型,重新定義主鍵,增加了維護資料庫的難度;
代理主鍵:把不具備業務含義的欄位作為主鍵,一般取名為"ID",且一般為整型,節省資料庫空間;主鍵建置原則只對代理主鍵有效!!
2.建置原則:6種
increment:自動成長,僅支援數字類型(不推薦使用);原理為先查詢資料庫表中最大ID值,然後再此基礎上加1.如果有使用者使用過該ID,後註冊使用者可以再次使用,導致資料重複問題;
identity:自動成長,僅支援資料類型,原理為調用了資料庫的增長方式.使用該策略之前應確定所使用的資料庫支援自動成長,如mysql;
sequence:原理是通過調用資料庫產生序列標識符,前提是確定資料庫支援序列,如oracle;
native:根據資料庫對自動產生表示符的能力來選擇identity或sequence,最為常用;
uuid:採用128位的UUID演算法來產生標識符,然後被編碼為32位的十六進位字串,由於字串佔用資料庫空間較整型較大,也不流行;
assigned:手動指派(java程式指定);如果不在映射關係檔案中配置id元素的generator屬性,則預設使用該策略;
3.配置建置原則:在實體類包下的映射關係檔案(實體類.hbm.xml)中
1 <class name="實體類全限定名" table="資料庫表名"> 2 <id name="OID名" column="資料庫表欄位名"> 3 <generator class="native"></generator> 4 </id> 5 ............... 6 </class>
三.緩衝機制
1.緩衝:
記憶體中的一塊臨時地區,用來提高訪問效率,hibernate的緩衝機制主要用於提高查詢效率;
2.一級緩衝:
(1)定義:session層級的緩衝(與session的生命週期一致),程式內建,不可卸載,由一系列的java集合(Map)構成;
(2)存取資料的時機:
i.調用save/update方法時,首先儲存到資料庫,再放入緩衝;
ii.調用get方法時,先從緩衝尋找,沒有話再從資料庫中尋找,然後放入緩衝;
(3)驗證一級緩衝的存在:兩次尋找同一對象,第一次查詢會發送sql語句,第二次沒有發送;
(4)內部結構:
存在緩衝區和快照區;快照區存放的是緩衝區資料的副本,程式員不可修改;程式員進行CRUD操作時其實是在操作緩衝區,在提交事務時,hibernate會比較兩塊地區資料的一致性,若不一致,則參照快取資料修改資料庫,並存入快照區一份.
3.二級緩衝:
SessionFactory層級的緩衝;外掛程式形式,需要配置並匯入jar包,已被redis等取代;
四.交易管理
1.概念:
邏輯上的一組最小操作單元,特點是同時成功或失敗,目的是保證操作的完整性和安全性;
2.特性:
原子性:最小操作單元,不可分割;
一致性:操作前後的資料保持一致;
隔離性:多個線程之間的事務互不影響;
持久性:事務提交後,儲存至資料庫,不可更改;
3.不考慮隔離性的前提下,會出現的問題
髒讀/不可重複讀取/虛讀
4.解決以上問題:設定隔離等級
read uncommited:不解決任何問題 1
read commited:解決髒讀問題 2 oracle的預設隔離等級
repeatable read:解決髒讀和不可重複讀取的問題 4 mysql的預設隔離等級
serializable:都可以解決,但是變為單線程,效率低 8
5.hibernate設定隔離等級
在核心設定檔(hibernate.cfg.xml)中,添加以下語句:
1 <hibernate-configuration> 2 <session-factory> 3 <property name="hibernate.connection.isolation">4</property> 4 ............ 5 </session-factory> 6 </hibernate-configuration>
6.事務控制在service層
(1)在核心設定檔(hibernate.cfg.xml)中,添加以下語句:
1 <hibernate-configuration> 2 <session-factory> 3 <property name="hibernate.current_session_context_class">thread</property> 4 ............ 5 </session-factory> 6 </hibernate-configuration>
(2)使用factory的getCurrentSession方法擷取session對象
(3)使用與當前線程綁定的session對象的時候,不用手動關閉