JPA @ManyToMany - 无法删除或更新父行:外键约束失败

2022-09-04 20:55:11

我有实体:

@Entity
public class User {

    @ManyToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<Role>();

@Entity
public class Role {

    @ManyToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
    private Set<Permission> permissions = new HashSet<Permission>();

执行删除/移除操作时,将引发以下异常:

Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`user_role`, CONSTRAINT `FK_USER_ROLE_roles_ID` FOREIGN KEY (`roles_ID`) REFERENCES `role` (`ID`))

生成的联接表和外键似乎存在问题。

如何修复此问题,以便删除角色?


编辑:

导出的 SQL 显示以下内容:

CREATE TABLE IF NOT EXISTS `user_role` (
  `User_ID` bigint(20) NOT NULL,
  `roles_ID` bigint(20) NOT NULL,
  PRIMARY KEY (`User_ID`,`roles_ID`),
  KEY `FK_USER_ROLE_roles_ID` (`roles_ID`)
)

答案 1

想想JPA如何解决多对多关系。

我猜它创建了表,表和表,其中包含对用户和角色的引用(外键)。UserRoleuser_role

现在,如果要删除角色,则必须删除用户持有的此角色的所有引用。为此,您必须循环访问具有此类角色的所有用户,并将其从此用户的角色列表中删除。然后,您可以安全地删除该角色。

顺便说一句,一旦你解决了这个问题,你可能会有下一个与.因此,如果我是你,我会暂时删除该字段,使角色删除正常工作,然后恢复为唯一的新问题(如果存在)。PermissionpermissionsRolepermissions


答案 2

尝试添加到您的映射中:CascadeType.REMOVE

@ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.EAGER)
private List<Role> roles = new ArrayList<Role>();

@ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.EAGER)
private Set<Permission> permissions = new HashSet<Permission>();

这样,子实体不必在父实体之前删除,因此您可以删除角色,而无需删除其权限。


推荐