2011-06-22 42 views
1

讓我直接得到我的問題,使用@OnDelete這裏將刪除這個和任何其他InventoryPreference實體,如果Inventory實體被刪除?我只是無法理解Hibernate's annotations的參考文獻..所以我需要你的幫助來確認我的理解正確。試圖瞭解CascadeType.ALL與@OnDelete的區別!

public class InventoryPreference { 
    ... 

    @ManyToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @JoinColumn(name = "inventory_id", nullable = false) 
    public Inventory getInventory() { 
     return inventory; 
    } 
} 

難道我那麼在Inventory實體需要使用CascadeType.ALL太多,如果該Inventory實體刪除,以讓所有的InventoryPreference小號刪除?

public class Inventory { 
    ... 

    @OneToMany(mappedBy = "inventory", cascade = CascadeType.ALL) 
    public Set<InventoryPreference> getPreferenceItems() { 
     return preferenceItems; 
    } 
} 

如果第一個問題是真實的,那麼我看不到的CascadeType.ALL點。如果不是,那麼當刪除Inventory時,它們每個都會做什麼以及我需要指定哪些註釋和配置來刪除InventoryPreference?哦,我不想Inventory被刪除,如果InventoryPreference被刪除。對不起,如果太明顯了。

回答

1

他們做了一些不同的事情。 @OnDelete是一個模式生成指令。它會將「刪除級聯」添加到爲外鍵(或等效方言)生成的DDL的末尾。如果不使用hibernate生成數據庫,則不會執行任何操作。

@OneToMany@ManyToOne上的cascade屬性是運行時用於生成其他實際SQL語句的屬性。這可能是你真正想要的,額外的刪除語句來刪除子項,而不是刪除數據庫表中打開的級聯項?如果你想要的是當你刪除一個庫存InventoryPreferences得到去除,然後你想:

@OneToMany(mappedBy = "inventory", cascade = CascadeType.REMOVE, orphanRemoval=true) 
public Set<InventoryPreference> getPreferenceItems() { 
    return preferenceItems; 
} 

當然,根據您的具體設計中增加額外的級聯類型。

+0

謝謝!是的,那正是我想要的。如果我像前面說的那樣將級聯配置添加到'@ OneToMany',那麼我不需要在級聯的'Inventory'實體中添加任何內容,對嗎? – Rihards

+0

那麼OneToMany是在庫存實體:)你不需要添加任何東西到ManyToOne映射庫存到InventoryPreference,沒有。我認爲這就是你的意思。 – Affe

+0

謝謝,再次感謝你!你從小時候的長時間閱讀中拯救了我的一天,並試圖理解Hibernate的參考,這是一場噩夢! :) – Rihards