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

Jam*_* P. 10 java many-to-many jpa

我有实体:

@Entity
public class User {

    @ManyToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<Role>();
Run Code Online (Sandbox Code Playgroud)
@Entity
public class Role {

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

执行删除/删除时,抛出以下异常:

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`))
Run Code Online (Sandbox Code Playgroud)

生成的连接表和外键似乎存在问题.

如何解决这个问题,以便删除一个角色?


编辑:

导出的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`)
)
Run Code Online (Sandbox Code Playgroud)

Ale*_*exR 7

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

我猜它会创建包含用户和角色的引用(外键)的表User,表Role和表user_role.

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

BTW一旦你解决了这个问题,你可能会有下一个问题Permission.所以,如果我是你,我会暂时删除该permissions字段,Role使角色删除工作,然后恢复permissions到唯一的新问题,如果存在.