[英]Delete with JPA and ManyToMany
我按照本教程设置了一个 spring 引导项目,该项目具有登录/注册系统,具有 jpa 和 spring 安全性。 在教程代码中,它生成一个“用户”、“角色”和“用户角色”表。 现在我想添加一条到 controller 的路由,通过将此路由添加到 controller 来按 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);
}
我还添加了一个简单的错误 controller ,如下所示:
@Controller("error")
public class ErrorController {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(HttpServletRequest request, Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("exception", ex.getLocalizedMessage());
mv.addObject("url", request.getRequestURL());
mv.setViewName("error");
return mv;
}
}
现在,每当我调用删除路由时,它都会转到我的错误页面,而控制台中没有真正的消息。 我尝试添加cascade = CascadeType.ALL
或 REMOVE 但都不起作用,只有在现在启动应用程序时我才会收到此异常消息(应用程序仍然启动):
Error executing DDL "alter table users_roles add constraint FK2o0jvgh89lemvvo17cbqvdxaa foreign key (user_id) references users (id)" via JDBC Statement
如何调整教程中的代码以删除用户?
我假设您有一个具有bidirectional
关系的实体,如下所示。
您需要添加cascade = CascadeType.ALL
和orphanRemoval = 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.