我有实体:
@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/