2013-02-17 63 views
1

我在Item和Category之間有@ManyToMany(雙向)關係。來自非擁有實體端的Cascade.ALL

class Item { 
    @ManyToMany(cascade = CascadeType.ALL) 
    Collection<Category> categories=new ArrayList<Category>(); 
} 

class Category { 
    @ManyToMany(mappedBy="categories", cascade = CascadeType.ALL) 
    Collection<Item> items=new ArrayList<Item>(); 
} 

我在兩者上都指定了CascadeType.ALL。物品是所有者。多對多關係將使用第三個表(Item_Category)

  1. 當我創建一個項目,並添加類別與項目,保存該項目內的所有類別獲得持續的項目進行映射。在連接表中還有必要的條目(如預期的那樣)。

  2. 但是,當我創建一個類別並向其中添加新項目並保存該類別時,我發現在項目和類別表中進行了必要的輸入,但在Item_Category連接表中沒有插入。因此,該關聯沒有正確創建。

這是預期的行爲嗎?如果我們在Item中添加類別,意味着關聯表將只有條目,因爲Item是關係的所有者?

回答

5

你在期待神奇,而Hibernate不是那樣的。保存一個破碎的對象模型會使事情破裂。如果Item和Category有雙向關係,那麼你必須設置總是兩端的關係。僅僅因爲你有Hibernate並不意味着你的代碼可能是懶惰的。

換句話說,你永遠不會寫這樣的代碼,並期望它的工作,你會(假設工作assert關鍵字)?

Category c = new Category(); 
Item i = new Item(); 
c.getItems().add(i); 
assert i.getCategories().contains(c); 

如果不是,那麼爲什麼當你將Hibernate添加到混合中時,它會工作?

+0

感謝您的回答。那麼我只是有疑問,因爲另一種方式正常工作(即只做一個項目setCategories和保存項目創建關聯表中的條目)。 – 2013-02-17 05:20:38

+2

無論如何,我在休眠網站上發現這個「雙向鏈接設置」這一過程對於雙向鏈接是絕對必要的。「感謝您的回答。 – 2013-02-17 06:10:45

1

由Hibernate ORM文檔的site: Example 7.27. Many to many association

>只發到關聯的反向端的更改不會持久<

逆結束意味着未持有端,如果你喜歡。所以是的,你應該調用擁有關係的持久方法來持久化Item_Category表。

相關問題