2012-08-24 56 views
3

我有兩個實體的menu_groups「和「頁」之間的許多一對多的關係如下休眠:上刪除級聯行動連接表

public class MenuGroup { 
     @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
     @JoinTable(name = "menu_group_pages",schema="live",  
        [email protected](name="menu_groups_id"), 
        [email protected](name="pages_id")) 
     private Set<Page> pages = new HashSet<Page>(); 
    } 

    public class Page { 
     @ManyToMany(fetch = FetchType.EAGER, mappedBy="pages", 
        cascade={CascadeType.MERGE}) 

     private Set<MenuGroup> menuGroups = new HashSet<MenuGroup>(); 
    } 

正如你可以看到有一個連接表,有兩個fk:menu_groups_id和pages_id。現在我想在此連接表中爲fk'pages_id'添加刪除級聯操作。對於正常表格,該陳述類似於

@OnDelete(action=OnDeleteAction.CASCADE) 

我怎麼能這樣做一個連接表?謝謝

回答

2

您將不得不手動設置數據庫中的級聯選項,然後調用託管頁面對象上的remove以將其從鏈接表中刪除。

的OnDelete註釋應該產生在DB級聯選項,但它似乎並沒有爲多對多(HHH-4404

工作。另一方面,如果你想避免任何架構更改,那麼你只需要移除MenuGroup和Page之間的關聯即可。在您的PageDAO(或任何您使用的抽象)中,您可以使用刪除方法來刪除關聯:

public void remove(Page page) { 
    for(MenuGroup menuGroup : page.getMenuGroups()){ 
     menuGroup.getPages().remove(page); 
    } 
    session.remove(page); 
} 
+0

感謝您的幫助 – Raistlin

0

我相信你只需要在你的ManyToMany註解中設置CascadeType以包含CascadeType.Remove。如果它符合您的數據模型,則可能可以執行CascadeType.All。它們都應該將刪除級聯到Page \ ManuGroup表以及連接表。

+1

嗨,感謝您的回覆。如果我在頁面類中設置了CascadeType.Remove,那麼當我刪除頁面時,相應的菜單組也會被刪除。當我刪除一個頁面時,我只想要刪除連接表中的關係,但不想要MenuGroup實體。這就是爲什麼我沒有使用CascadeType.REMOVE。任何關於該問題的建議 – Raistlin