天天看點

hibernate筆記--cascade級聯以及inverse屬性

cascade : 

  不管是單向多對一還是一對多,或者是雙向的一對多關系,在一的一端映射檔案中有一個set标簽,在多的一端有many-to-one标簽,拿前幾篇筆記裡講的Grade和Student舉例,此标簽下都有一個cascade屬性:

  Grade.hbm.xml中:

<set name="students" cascade="save-update">
        <key column="gradeId" ></key>
        <one-to-many class="Student"/>
    </set>      

Student.hbm.xml中:

<many-to-one name="grade" class="Grade" column="gradeId" not-null="true" cascade="save-update"></many-to-one>      

cascade表示級聯:讓操作級聯到子實體,常見的有以下幾個取值:

save-update:在儲存和目前一端資料時,另一端資料可以一起儲存.如上,假如Student.hbm.xml中設定了 cascade="save-update",那麼在儲存資料時,隻需要儲存Student就可以,hibernate會自動把它相關聯的另一端的Grade的資料儲存起來.

none:不級聯(不寫就是預設不級聯)

delete:删除級聯(不能在多的一端執行)

all:表示所有操作都級聯

注意:

  1. cascade是級聯操作,使得在一段操作資料時,可以級聯操作在另外一端的資料
  2. 在多對一的關系中,多的一端不能操作級聯為delete,一般在多的一端設為save-update
  3. 在一對多的關系中,如果一的一端設定為delete,多的一端不能指明外鍵為空

inverse:

  在一的一端(Grade)的<set>标簽中有一個inverse屬性,:

<set name="students" inverse="false">
        <key column="gradeId" ></key>
        <one-to-many class="Student"/>
</set>      

inverse屬性表示由誰來管理關聯關系,預設為false.

inverse="false":表示雙方都可以管理關聯關系,誰管理關系誰來維護,如果都管理了則雙方都可以維護,當關系由多的一端(Student)來維護時,效率更高.因為如果關系由一的一端(Grade)來維護時,會多執行幾個Update語句.

inverse="true":表示由多的一端來管理關聯關系,不管一的一端是否管理關系,都由多的一端來維護關系.建議設為"true".

  那麼什麼是管理關系呢? 假設Student中,執行了setGrade()方法時,将Grade執行個體賦給了Student執行個體,就表示Student類管理了關系,這到底什麼意思呢?其實很簡單,假如儲存資料的時候,我們儲存Student資訊時,引用了Grade,那麼儲存時會維護Student和Grade的關系,即會在Student中存在Grade的外鍵值,否則,Student的外鍵值是為null的(當然前提是我們沒有設定not-null="true"),