4

次のように、2つのエンティティ「menu_groups」と「pages」の間に多対多の関係があります

    public class MenuGroup {
        @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
        @JoinTable(name = "menu_group_pages",schema="live",    
                  joinColumns=@JoinColumn(name="menu_groups_id"),
                  inverseJoinColumns=@JoinColumn(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>();
    }

ご覧のとおり、menu_groups_id と pages_id の 2 つの fk を持つ結合テーブルがあります。ここで、この結合テーブルの fk 'pages_id' に削除カスケード アクションを追加します。通常のテーブルの場合、ステートメントは次のようになります

    @OnDelete(action=OnDeleteAction.CASCADE)

結合テーブルに対してこれを行うにはどうすればよいですか? ありがとう

4

2 に答える 2

2

データベースでカスケード オプションを手動で設定する必要があります。次に、マネージド ページ オブジェクトで remove を呼び出して、リンク テーブルから削除する必要があります。

OnDelete アノテーションは DB でカスケード オプションを生成する必要がありますが、ManyToMany では機能しないようです ( HHH-4404 )

一方、スキーマの変更を避けたい場合は、MenuGroup と Page の間の関連付けを削除するだけで済みます。PageDAO (または使用する抽象化) では、関連付けを削除する remove メソッドを使用できます。

public void remove(Page page) {
    for(MenuGroup menuGroup : page.getMenuGroups()){
        menuGroup.getPages().remove(page);
    }
    session.remove(page);
}
于 2012-08-26T22:26:05.433 に答える
0

ManyToMany アノテーションに CascadeType を設定して、CascadeType.Remove同様に含める必要があると思います。CascadeType.Allデータモデルに適合する場合は、できるかもしれません。これらのいずれかにより、削除が Page\ManuGroup テーブルと結合テーブルの両方にカスケードされます。

于 2012-08-24T18:31:40.763 に答える