hibernate多对多可以防止删除子项

时间:2015-06-24 08:49:01

标签: java hibernate

我目前正在使用hibernatejava。我有一个Group班和一个User班。它们具有多对多的关系,因为用户可以在多个组中,并且组可以具有多个用户。您可以在此处查看我们ERD的一部分:ERD

我定义关系的Group类的一部分:

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "Group_Users", catalog = "jelo3", joinColumns = {
            @JoinColumn(name = "Group_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "User_id", nullable = false, updatable = false) })
    public Set<User> getAllGroupMembers() {
        return this.allGroupMembers;
    }

我删除该组的部分:

    @Override
    public void delete(int id) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Group g = (Group) session.get(Group.class, id);
        session.getTransaction().commit();
        if (g != null) {
            session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            session.delete(g);
            session.getTransaction().commit();
        }
    }

观察:问题在于,当我删除某个群组时,该群组中的所有用户也会被删除。

实际要求:删除组时,应删除链接表中的所有记录,但不应删除用户。

2 个答案:

答案 0 :(得分:1)

您从cascade = CascadeType.ALLGroupUser,这意味着在该组上调用的删除操作将级联到该组中的所有用户。使用双向映射时,您需要维护关系的两个方面。

当您从数据库获取Group时,请浏览其用户并从其组列表中删除该组。之后,从组中删除用户。像这样的东西

    if (g != null) {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        for (User u : g.getUsers()) {
            u.getGroups().remove(g);
        }
        g.getUsers().clear();
        session.delete(g);
        session.getTransaction().commit();
    }

答案 1 :(得分:0)

可以在DDL中配置

DELETE ON CASCADE以删除子节点,同时删除要定义的hibernate映射中的Parent或CascadeType枚举