【问题标题】:Configure many-to-many relationships in Spring Data REST so deleting one object does not delete the other在 Spring Data REST 中配置多对多关系,因此删除一个对象不会删除另一个对象
【发布时间】:2017-12-02 08:05:26
【问题描述】:

我正在使用最新的 Spring Data REST(带有 JPA 和 MySQL DB)项目。我有两个要建立关系的对象。但是当我删除两者之一时,我只想删除关系和收到删除请求的对象(不是两个对象)。

我在说什么:

  • 一项任务
  • 一个用户

其中一项任务可以与(“拥有”)多个用户相关,而一个用户可以与(“拥有”)多个任务相关

任务类:

@ManyToMany
@JoinTable(name = "task_user", joinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users;

用户类别:

@ManyToMany(mappedBy = "users")
private Set<Task> tasks;

task_user 表由两列组成

  • task_id(任务的id)
  • user_id(用户的id)

当我删除一个任务(通过 DELETE 到 /task/{id})时,它的行为正确(任务从任务表中删除,关系从 task_user 表中删除)。我遇到的问题是,当我删除一个用户时,它从用户表中删除,但关系仍然存在于 task_user 表中。

我想要的:

  • 删除任务,删除“task_user”中的所有对应条目和“task”中的条目;不会删除“用户”中的条目
  • 删除用户,删除“task_user”中的所有对应条目和“user”中的条目;不删除“任务”中的条目

是否可以通过配置来实现?还是我需要使用外键或自定义逻辑,例如事件处理程序?

【问题讨论】:

    标签: java jpa spring-data spring-data-jpa spring-data-rest


    【解决方案1】:

    试试这个:

    public class User {
       //...
       @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
       private Set<Task> tasks;
       //...
    }
    
    public class Task {
       //...
        @ManyToMany(mappedBy = "tasks")
        private Set<User> users;
       //...
    }
    

    您选择了多对多的双向变体,因此不要忘记 User 类中的“辅助方法”。请参阅文档:associations many-to-many

    见我的exampletests

    【讨论】:

    • 谢谢!级联是我所需要的。
    【解决方案2】:

    需要将表task_user的外键user_id的级联类型改为级联删除。例如使用 IntelliJ 内置数据库工具:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多