gpt4 book ai didi

java - 尝试删除记录时如何修复 Spring-Boot 中的 "violates foreign key constraint"。使用@ManyToMany

转载 作者:行者123 更新时间:2023-12-04 15:46:37 25 4
gpt4 key购买 nike

我试图从我的数据库中删除一些记录,但我收到以下错误:“更新或删除表“角色”违反了表“users_role”上的外键约束“fk3qjq7qsiigxa82jgk0i0wuq3g”“

我做了一些研究,我发现这可能与我设置为@ManyToMany 的关系之一有关。

我尝试从本网站的其他示例中修改我的代码,但没有成功。

public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "users_id")
private long id;
@Column(name = "email")
@Email(message = "*Please provide a valid Email")
@NotEmpty(message = "*Please provide an email")
private String email;
@Column(name = "password")
@Length(min = 5, message = "*Your password must have at least 5 characters")
@NotEmpty(message = "*Please provide your password")
private String password;
@Column(name = "name")
@NotEmpty(message = "*Please provide your name")
private String name;
@Column(name = "surname")
@NotEmpty(message = "*Please provide your surname")
private String surname;
@Column(name = "active")
private int active;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "users_role", joinColumns = @JoinColumn(name = "users_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;

@Column(name = "position")
private String position;

public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private int id;

public class UserController {
.
.
.
.
@GetMapping("/admin/deleteuser/{id}")
public String deleteUser(@PathVariable("id") long id, Model model) {
User user = userRepository.findById(Long.valueOf(id)).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));

userRepository.delete(user);
model.addAttribute("users", userRepository.findAll());
return "/admin/show-users";
}

最佳答案

问题似乎在这里:

    @ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "users_role", joinColumns = @JoinColumn(name = "users_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;

特别是 CascadeType.ALL意味着当您尝试删除 User 时,该删除将级联到该 User的角色。您不太可能希望那样,因为使关系成为多对多而不是一对多的全部意义在于,不止一个用户可以拥有一个给定的角色。如果您尝试删除角色(无论是直接删除还是通过级联删除),则有两种选择:
  • 删除级联到具有相同角色的所有其他用户(然后返回到所有这些用户的角色等,或
  • 删除失败。

  • 你看到(2)。报告的特定约束违规与 user_role 中其他用户的行有关尝试删除角色时的表格。

    我不清楚你是否真的想从 User 级联任何持久性操作s 到他们分配的 Role s。我倾向于认为不是,在这种情况下,您不需要指定 cascade您的 ManyToMany 的属性根本:
        @ManyToMany
    @JoinTable(name = "users_role", joinColumns = @JoinColumn(name = "users_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    但是,如果您进行级联,则需要指定所需的各个级联类型,省略 CascadeType.REMOVE ,也许像
        @ManyToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH})
    @JoinTable(name = "users_role", joinColumns = @JoinColumn(name = "users_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    关于java - 尝试删除记录时如何修复 Spring-Boot 中的 "violates foreign key constraint"。使用@ManyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55475980/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com