Hinernate2

Hiroshima持久化類與主鍵生成策略:
 Hibernate持久化類(PO)的編寫規則:
  1、必須提供public的無參構造
  2、屬性private,有public的get/set方法
  3、在PO中必須有一個標識屬性對應數據庫的主鍵-->OID
   Hibernate通過OID區分不同的PO類,如果內存種有兩個相同的OID對象,那麼Hibernate會認爲是同一個對象
  4、PO類的屬性儘量使用基本數據類型的包裝類
   使用基本數據類型不能描述不存在概念,包裝類是對象,默認值是null
  5、PO類不能使用final修飾
 hibernate中get和load方法的區別:【*****】
  1、get直接獲得一個持久化類型對象,立即查詢
    load獲得持久化類的代理類型對象(子類),延遲策略查詢
  2、get查詢不存在返回null
     load查詢不存在產生異常
  
Hibernate的主鍵生成策略:
 自然主鍵:具有業務含義
 代理主鍵: 不具有業務含義【*****】
 increment:
  Hibernate維護,自動生成,遞增;
  優點:方便跨平臺;
  缺點:不適合高併發訪問
 indenty:
  底層數據庫維護,自動生成,遞增,-->mysql
  優點:由底層數據庫維護,和Hibernate無關
  缺點:只能對自動增長的數據庫有效
 sequence:
  底層數據庫維護,數據庫支持序列-->oracle
  優點:由底層數據庫維護,和Hibernate無關
  缺點:數據庫必須支持sequence
 native:
  匹配底層數據庫自動選擇生成策略,有Hibernate控制
  優點:在項目中如果有多個數據庫可以使用
  缺點:效率低
 uuid:【*****】
  Hibernate採用128bit算法生成,唯一
  優點:與數據庫無關,方便數據庫移植,效率高,唯一
  缺點:佔用空間大
 assigned:
  java程序生成

Hibernate持久化對象的狀態:
 瞬時態(臨時態,自由態):
  無OID,與數據庫信息無關聯,與Session無關聯,一般指直接new出來的對象
  瞬時態-->持久態:
   save saveOrUpdate
  瞬時態-->託管態:
   手動設置OID -->一般不會這麼做
 持久態:
  有OID,有Session管理,在數據庫中可能有,可能無
  持久態-->瞬時態:
   delete --> 被刪除後持久化對象不建議使用
  持久態-->託管態:
   close clear evict 
 託管態(遊離態,離線態):
  失去與Session的關聯,有OID,在數據庫中可能有,可能無
  託管態-->瞬時態
   刪除OID
  託管態-->持久態:
   update saveOrUpdate lock(過時)

Hibernate一級緩存:Session
 actionQueue 快照區
 persistenceContext緩存區
 Hibernate的一級緩存的目的就是爲了減少對數據庫的訪問
 持久化對象具有自動更新數據庫的能力:
  當事務提交,Session關閉時,向數據庫發送請求,會判斷一級緩存中的數據是否與快照一致,若不一致會發送update語句
 一級緩存常用的API:
  clear:清空一級緩存
  evict:清空一級緩存中指定對象
  refresh:重新查詢數據庫,更新一級緩存和快照
 注意事項:
  當對一個託管對象進行update操作時,會將託管對象轉成持久對象再操作
  如果session中出現相同的OID對象,會產生異常
  如果託管對象的OID在數據庫不存在,對象託管對象進行update操作時,會產生異常
   -->先查再操作【*****】
  如果刪除一個託管對象,託管對象會先於session關聯再刪除
   -->先刪除一級緩存,再刪除數據庫數據

    Hibernate的關係映射:
  一對多的關係映射配置文件:(雙向配置)
   多.hbm.xml:
   <many-to-one name="多描述一的屬性名稱" class="一的全路徑" colume="多的外鍵名稱"/>
   一.hbm.xml:
   <set name="一描述多的屬性名稱">
    <key column="多的外鍵名稱"/>
    <one-to-many class="多的全路徑"/>
   </set>

  想要在保存多的同時保存關聯的一:
   需要在多的一方配置 cascade="save-update"
  想要在保存一的同時保存關聯的多:
   需要在意的一方配置 cascade="save-update"
  雙向關聯維護:
   在開發的使用需要雙向配置;而在操作是隻進行單向操作-->減少資源的浪費
    -->在一的一方配置inverse="true"-->由對方維護外鍵
  級聯刪除:
   想要刪除一的同時刪除多:
    需要在一的一方配置-->cascade="delete"
  從session中獲得一的對象和多的對象,想要從一的對象中刪除多:
   需要在一的一方配置-->cascade="delete-orphan"

  cascade的取值:
   none:默認值
   save-update:當底層save update或saveOrUpdare時,級聯保存臨時對象,如果是託管對象,或執行update
   delete:級聯刪除
   delete-orphan:刪除與當前對象解除關係的對象
   all:包含了save-update delete
   all-delete-orphan:包含了 delete-orphan all


 擴展二級緩存:SessionFactory:
  1、導入緩存jar包;
  2、配置緩存文件;
  3、在Hibernate核心配置文件中開啓二級緩存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章