java - JPA @ManyToMany - 无法删除或更新父行 : a foreign key constraint fails

标签 java jpa many-to-many

我有实体:

@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`)
)

最佳答案

想想JPA是怎么解决多对多关系的。

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

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

顺便说一句,一旦你解决了这个问题,你可能会得到下一个具有Permission 的问题。所以,如果我是你,我会暂时从 Role 中删除 permissions 字段,使角色删除有效,然后将 permissions 恢复为唯一新的如果存在问题。

关于java - JPA @ManyToMany - 无法删除或更新父行 : a foreign key constraint fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24014036/

相关文章:

mysql - Spring 启动: Deleting an entity in a many to many relationship

java - 具有 JPA 事务的 JAX-WS Web 服务

java - JVM创建线程时如何使用操作系统?

java - 使用 Java Web 服务从 IP 地址派生国家/地区代码

java - 为什么我的数组不打印出我的输入?

google-app-engine - Grails,App Engine,JPA-初学者在Grails上遇到麻烦

java - 使用元模型区分大小写条件的 JPA 2 Criteria API

java - 如何避免ManyToMany关系上的双向插入

Mysql 使用交叉引用选择行,但根据条件省略

java - 是否可以一次从 HazelcastInstance( map 和列表)中删除所有数据?