天天看點

Hibernate中cascade與inverse

[color=red][size=large]cascade:[/size][/color]

當Hibernate持久化一個"自由态對象"時,在預設的情況下(沒有設定cascade或cascade=none時),Hibernate不會自動持久化他所關聯的其他臨時對象。在cascade="save-update"或者cascade="all"時,當Hibernate向資料庫表中插入"新"對象記錄時,會檢查該對象所關聯的屬性是否發生變化,如果發生變化,就按照級聯屬性(cascade)所設定的内容進行操作。

如一個person類和一個QQ類,他們是one-to-many的關系。person類中qqs屬性對應配置檔案set的cascade屬性設為cascade="save-update"。

[color=red][size=large]inverse[/size][/color]

在Hibernate執行getSession().save(p)這段代碼時通過show_sql開啟顯示sql語句功能,那麼控制台将會顯示3條sql語句。

第一條是将新的資料插入person,第二條是插入qq,而第三條是一條update語句。

我們先來看一下資料庫,在person表和qq表中,qq表是外鍵表,qq表中的person_id是外鍵,即兩表存在主外鍵關聯。

當調用p.getQqs().add(qq)方法,進行添加時,Hibernate怕在進行p.getQqs().add(qq)這樣的操作時出現意外情況,即添加方(qq)和被添加方(p)存在外鍵不一緻的情況。是以就會出現那條更新語句。

inverse的預設值為false,是以inverse屬性預設會進行“關聯更新”。inverse值為true,會放棄“關聯更新”。

通俗點講,将inverse設為false的那一方,意思就是你添加完資訊後我還要來維護一下,是以會出現update語句,如果将inverse設為true的話,意思就是我完全相信你,你添加後我就不需要在維護了,是以不會出現update語句。

繼續閱讀