Hibernate學習——持久化類的學習

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.主鍵的分類

    •   天然主鍵:主鍵的自己就是表中的一個字段。例子:好比人員表中,有人員姓名,身份證號屬性。每一個人都有本身的身份證,身份證號就是一個一個天然主鍵  
    •        代理主鍵:用了一個與該表不相關的字段,如id主鍵,這種主鍵叫作代理主鍵 

          通常用後面的代理主鍵。一旦天然主鍵參與業務邏輯編碼中,後期變更可能須要修改源碼。

  3.Hibernate中的主要生成策略

    •  Increment.   Hibernate中提供的自動增加機制,適用於short,int,long類型主鍵,在單線程程序使用,多線程會出錯。首先發送一條語句 select max(id) from table,而後讓id+1做爲下一條記錄的主鍵。
    •     Indentity .     適用於short,into,long類型主鍵,用的是數據庫底層的自動增加機制。適用於有本身增加機制的數據庫(mysql,mssql),注意oracle是沒有自動增張機制  
    •    Sequence.    適用於short,int,long類型主鍵,用的是序列的方式,如oracle。
    •     Uuid              適用於字符串類型主鍵。適用Hibernate中隨機方式生成的字符串主鍵。
    •  native           本地策略,能夠再identify和sequence之間自動切換(通常就用這個就好了)
    •     assigned       Hibernate放棄外鍵管理,須要經過手動編寫程序或者用戶本身設置
    •     foreign           外部的。使用另一個相關聯的對象的主鍵做爲該對象主鍵。主要用於一對一關係中。

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()
相關文章
相關標籤/搜索