【问题标题】:Spring MVC + HIbernate ManyToMany mapping , delete cascade self joinSpring MVC + HIbernate ManyToMany 映射,删除级联自连接
【发布时间】:2015-02-12 12:18:14
【问题描述】:

我有两张桌子

用户

标识 |名称

1 |用户 1

2 |用户 2

User_Helper

user_id | helper_id

1 | 2

user_id 和 helper_id 是从 users 表中引用的 id。

现在,当我删除用户 1 时,该条目将从映射表中删除。但是当我删除 2 时,我得到异常说,它已在映射表中被引用

这是我的实体代码

@ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "user_helper", joinColumns = {
            @JoinColumn(name = "user_id", updatable = false)}, inverseJoinColumns = {
            @JoinColumn(name = "helper_id", updatable = false)})
    private Set<Users> helpers;

我错过了什么

【问题讨论】:

  • 表 user_helper 没有 user_id = 2 的行

标签: java hibernate spring-mvc


【解决方案1】:

删除助手时,您必须首先将其从任何引用它的用户中删除。这将从连接表中清除对它的引用。

user.getHelpers().remove(helper);
session.delete(helper);

【讨论】:

  • 你能检查一下在调用remove() 之后,助手实际上已经从集合中移除了吗?此外,user 应该是托管对象才能使其正常工作。
  • No.. 无论你的代码做什么,都是由级联本身隐式完成的。帮助者被轻松删除,问题是在删除帮助者列中的用户时。我是如何让它工作的,不确定它是否正确..发布了我的答案
【解决方案2】:

我通过在用户实体中再添加一条映射线来实现它

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "user_helper", joinColumns = {
            @JoinColumn(name = "helper_id", updatable = false)}, inverseJoinColumns = {
            @JoinColumn(name = "user_id", updatable = false)})
private Set<Users> users;

在删除之前,我清除用户

userEntity.getUsers().clear(); // so, if there are any users associated with helpers, it will be cleared from mapping table
userEntityDAO.delete(userEntity);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2014-05-08
    • 2011-06-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多