在Spring Data REST中配置多对多关系,因此删除一个对象不会删除另一个

时间:2017-06-28 19:43:13

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

我正在使用最新的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表中。

我想要的是什么:

  • 删除任务,删除&#34; task_user&#34;中的所有相应条目。并且输入&#34;任务&#34 ;;不会删除&#34; user&#34;
  • 中的条目
  • 删除用户,删除&#34; task_user&#34;中的所有相应条目。和&#34;用户&#34;中的条目;不会删除&#34;任务&#34;
  • 中的条目

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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