標籤:存在 單向關聯 提前 設定 http 9.png 一點 情況 影響
在以前使用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一對多關聯關係儲存時的探究