在 Spring Data REST 中配置多对多关系,因此删除一个对象不会删除另一个
Configure many-to-many relationships in Spring Data REST so deleting one object does not delete the other
我正在使用最新的 Spring Data REST(使用 JPA 和 MySQL DB)项目。我有两个对象,我想在它们之间建立关系。但是当我删除两者之一时,我只想删除关系和收到删除请求的对象(不是两个对象)。
我要说的是:
- 一个任务
- 一个用户
一个任务可以与 ("owned by") 个多个用户相关,一个用户可以与 ("own") 个多个任务相关
任务Class:
@ManyToMany
@JoinTable(name = "task_user", joinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users;
用户class:
@ManyToMany(mappedBy = "users")
private Set<Task> tasks;
task_usertable由两列组成
- task_id(任务id)
- user_id(用户id)
当我删除任务时(通过 DELETE 到 /task/{id}),它的行为正确(任务从任务 table 中删除,关系从 task_user 中删除table)。我遇到的问题是,当我删除用户时,它会从用户 table 中删除,但关系仍然存在于 task_user table.
我想要的:
- 删除任务,删除"task_user"中的所有对应条目和"task"中的条目;不删除 "user"
中的条目
- 删除用户,删除"task_user"中的所有对应条目和"user"中的条目;不删除 "task"
中的条目
是否可以通过配置实现?或者我是否需要使用外键或自定义逻辑,例如事件处理程序?
试试这个:
public class User {
//...
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Task> tasks;
//...
}
public class Task {
//...
@ManyToMany(mappedBy = "tasks")
private Set<User> users;
//...
}
您选择了多对多的双向变体,所以不要忘记用户 class 中的 'helper methods'。请参阅文档:associations many-to-many.
您需要将 table task_user
的外键 user_id
的级联类型更改为级联删除。例如使用 IntelliJ 内置的数据库工具:
我正在使用最新的 Spring Data REST(使用 JPA 和 MySQL DB)项目。我有两个对象,我想在它们之间建立关系。但是当我删除两者之一时,我只想删除关系和收到删除请求的对象(不是两个对象)。
我要说的是:
- 一个任务
- 一个用户
一个任务可以与 ("owned by") 个多个用户相关,一个用户可以与 ("own") 个多个任务相关
任务Class:
@ManyToMany
@JoinTable(name = "task_user", joinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users;
用户class:
@ManyToMany(mappedBy = "users")
private Set<Task> tasks;
task_usertable由两列组成
- task_id(任务id)
- user_id(用户id)
当我删除任务时(通过 DELETE 到 /task/{id}),它的行为正确(任务从任务 table 中删除,关系从 task_user 中删除table)。我遇到的问题是,当我删除用户时,它会从用户 table 中删除,但关系仍然存在于 task_user table.
我想要的:
- 删除任务,删除"task_user"中的所有对应条目和"task"中的条目;不删除 "user" 中的条目
- 删除用户,删除"task_user"中的所有对应条目和"user"中的条目;不删除 "task" 中的条目
是否可以通过配置实现?或者我是否需要使用外键或自定义逻辑,例如事件处理程序?
试试这个:
public class User {
//...
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Task> tasks;
//...
}
public class Task {
//...
@ManyToMany(mappedBy = "tasks")
private Set<User> users;
//...
}
您选择了多对多的双向变体,所以不要忘记用户 class 中的 'helper methods'。请参阅文档:associations many-to-many.
您需要将 table task_user
的外键 user_id
的级联类型更改为级联删除。例如使用 IntelliJ 内置的数据库工具: