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


        在以前使用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)。
      

五、總結

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

 

 

 
 
 
 


 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM