簡體   English   中英

使用 JPA 和 ManyToMany 刪除

[英]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.ALLorphanRemoval = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM