1. 程式人生 > >Hibernate一對多關聯關系保存時的探究

Hibernate一對多關聯關系保存時的探究

product 建立 9.png pan 保存 實踐 不能 一對多 cnblogs

在以前使用hibernate時,經常對保存存在關聯關系的對象時,不確定是否能保存成功。
因此,特意對一對多關系的2個對象進行實踐。

一、pojo類和配置文件的準備

這裏有一點提前說一下,外鍵列在數據庫中沒有設置為不為null。因此可以出現外鍵為空的情況。
(1)pojo類 技術分享 技術分享 (2)映射文件 技術分享 技術分享(3)測試類中方法的準備 技術分享

二、雙方都維護關聯關系且雙向關聯

註意:這裏的雙向關聯是指雙向都建立關系
(1)1方和多方都保存,且建立了雙向關聯的關系。這樣是肯定可以保存成功的。
技術分享
技術分享
(2)1方或多方中,有一方沒有保存。那麽會保存失敗,因為保存時分類是瞬時態對象,所以失敗。
技術分享技術分享
(3)在(2)的代碼的基礎上,給product的映射文件中配置一個級聯保存。這樣在保存產品時就會級聯保存分類,這樣分類不是瞬時態對象了,保存成功

技術分享 技術分享

三、雙向維護外鍵,但只建立單向關聯關系

(1)產品中沒有分類,由於外鍵可以為null;因此可以保存成功
技術分享技術分享
(2)產品中沒有分類,分類中有產品。產品和分類都執行保存,保存成功 技術分享 技術分享(3)產品中沒有分類,分類中有產品,只保存分類。這裏肯定保存失敗,因為分類也會維護外鍵。 當分類維護外鍵時,發現集合裏面的產品是瞬時態對象。所以肯定保存失敗了
技術分享

四、外鍵只靠多方維護

先把一方維護外鍵的功能取消,只需要在分類的映射文件中,配置inverse為true
技術分享(1)產品中有分類,只保存產品。這樣由於保存產品時,會去維護外鍵,而用來維護外鍵的分類對象為瞬時態對象,所以一定保存失敗技術分享 (2)針對(1)我們在保存產品後面添加保存分類。這樣保存產品時,用於維護外鍵用的對象就是持久態對象了。這樣就保存成功技術分享(3)產品中有分類,分類中有產品,只保存分類。保存成功。因為分類不會維護外鍵,所以不管集合裏面裝什麽狀態的對象都不影響。
技術分享(4)產品中有分類,只保存分類。一定保存成功,因為分類不維護外鍵,且用於維護外鍵的對象也沒有。道理同(3)。 技術分享

五、總結

看了這麽多實例,發現保存失敗的原因都是一樣的。就是拿來去更新外鍵的對象(這個描述可能有點繞口)不能是瞬時態。 比如,產品這一方維護外鍵的話,那麽他的用來更新外鍵的對象就是他裏面的那個分類。如果這個分類是瞬時態對象,肯定保存失敗。







Hibernate一對多關聯關系保存時的探究