2012-05-03 106 views
0

我遇到了jpa和hibernate的一個討厭的bug。我有一個記賬類別有以下注釋:當對象從集合中刪除時,Hibernate更新一對多集合

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
@JoinColumn(name="ch1_id", referencedColumnName="id") 
private List<BillingItem>billingItems = new ArrayList<BillingItem>(); 

現在我需要從收集過濾器中刪除的項目,但不能使用任何東西,但JPA。不允許使用hibernate特定的註釋。所以我寫了一個帖子負載功能:

@PostLoad 
public void postLoad() { 
    ArrayList<BillingItem>tempItems = new ArrayList<BillingItem>(); 

    Iterator<BillingItem> i = this.billingItems.iterator(); 
    BillingItem item; 
    while(i.hasNext()) { 
     item = i.next();    
     if(item.getStatus().equals("D")) { 
      tempItems.add(item);     
     }      
    } 

    this.billingItems.removeAll(tempItems); 
} 

然而,當有被刪除的項目篩選我看到

休眠:更新billing_on_item設置ch1_id =空在那裏ch1_id =?和id =?

它產生一個異常,因爲ch1_id是一個外鍵,不能爲空。然而,hibernate將參數綁定到正確的值。爲什麼此更新首先發生?我如何糾正錯誤?

由於提前,

蘭迪

回答

4

通過從收集的物品,你告訴Hibernate的這兩個實體之間的關係不存在了,所以很明顯,休眠刪除物化什麼數據庫中的這種關聯:它將外鍵設置爲空。

你可能想要的是隻是在你的實體吸氣只返回非已刪除項目:

public List<BillingItem> getNonDeletedItems() { 
    List<BillingItem> result = new ArrayList<BillingItem>(); 
    for (BillingItem item : this.billingItems) { 
     if (!"D".equals(item.getStatus()) { 
      result.add(item); 
     } 
    } 
    return result; 
} 
+0

謝謝你!我從來沒有想到像這樣簡單優雅的解決方案。說得通。 – randy

0

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)行說,這將級聯的所有更新。看看CascadeType