Java 使用JPA和ManyToMany删除

Java 使用JPA和ManyToMany删除,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我按照这个步骤设置了一个spring引导项目,其中包含一个带有jpa和spring安全性的登录/注册系统。在教程代码中,它生成“用户”、“角色”和“用户/角色”表。现在,我想向控制器添加一条路由,通过将此路由添加到控制器,该路由将按id删除用户: @RequestMapping(value = "/user_delete", method = RequestMethod.GET) public String deleteUser(@RequestParam l

我按照这个步骤设置了一个spring引导项目,其中包含一个带有jpa和spring安全性的登录/注册系统。在教程代码中,它生成“用户”、“角色”和“用户/角色”表。现在,我想向控制器添加一条路由,通过将此路由添加到控制器,该路由将按id删除用户:

    @RequestMapping(value = "/user_delete", method = RequestMethod.GET)
    public String deleteUser(@RequestParam long id) {
        userService.deleteUser(id);
        return "redirect:/admin/users";
    }
并向UserService添加了删除方法,如下所示:

    @Override
    public void deleteUser(long id) {
        User u = userRepository.findById(id).get();
        Set<Role> roles = u.getRoles();
        while(roles.iterator().hasNext()) 
        {   
            Role role = roles.iterator().next();
            Set<User> users = role.getUsers();
            users.remove(u);
            role.setUsers(users);
            roleRepository.save(role);
            roles.remove(role);
        }
        u.setRoles(roles);
        userRepository.save(u);
        userRepository.deleteById(id);
    }
现在,每当我调用delete路由时,它都会转到我的错误页面,而控制台中没有真正的消息。我尝试添加
cascade=CascadeType.ALL
或REMOVE,但都不起作用,只有在启动应用程序时,我才收到此异常消息(应用程序仍然启动):


如何调整教程中的代码以删除用户?

我假设您有一个具有双向关系的实体,如下所示

您需要添加
cascade=CascadeType.ALL
orphanRemoving=true
,也可以尝试
cascade=CascadeType.REMOVE

@Entity
public class User implements java.io.Serializable {

    @Id
    @Column(name = "user_id")
    private Long userId;// primary key

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Role> roles;
}

@Entity
public class Role implements java.io.Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}
@实体
公共类用户实现java.io.Serializable{
@身份证
@列(name=“user\u id”)
private Long userId;//主键
@OneToMany(mappedBy=“user”,cascade=CascadeType.ALL,orphan=true)
私人设定角色;
}
@实体
公共类角色实现java.io.Serializable{
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“user\u id”)
私人用户;
}

将级联设置为
删除
,并在删除元素之前删除对象(另一侧)的用法。这行得通吗?那么将cascade设置为在用户上删除,并删除角色中的
set users
?或者您的意思是在删除之前清除设置的角色?我已尝试清除关系双向(其双向ALDO
user.getRoles().remove(user)中不起作用的集合或类似的方法(可能还保存了另一个对象)。谢谢,这很有效!我错过了取回的部分
Error executing DDL "alter table users_roles add constraint FK2o0jvgh89lemvvo17cbqvdxaa foreign key (user_id) references users (id)" via JDBC Statement
@Entity
public class User implements java.io.Serializable {

    @Id
    @Column(name = "user_id")
    private Long userId;// primary key

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Role> roles;
}

@Entity
public class Role implements java.io.Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}