[英]JPA: Foreign key constraint on delete
我有以下关系
Class UserAccount{
//Other fields
@OneToMany(mappedBy = "userAccount", cascade = CascadeType.REMOVE)
private Set<Images> imagesShared;
@ManyToMany
@JoinTable(name = "USER_LIKES", joinColumns = @JoinColumn(name = "USER_NAME"), inverseJoinColumns = @JoinColumn(name = "ID"))
private Set<Images> imagesLiked;
}
Class Images{
//other fields
@ManyToMany(mappedBy = "imagesLiked")
private Set<UserAccount> likes;
}
这些行之后我出现异常
Hibernate: delete from IMAGES where ID=?
Hibernate: delete from COMMENTS where COMMENT_ID=?
Hibernate: delete from COMMENTS where COMMENT_ID=?
Hibernate: delete from COMMENTS where COMMENT_ID=?
Hibernate: delete from COMMENTS where COMMENT_ID=?
Hibernate: delete from COMMENTS where COMMENT_ID=?
Hibernate: delete from IMAGES where ID=?
例外:
Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`USER_LIKES`, CONSTRAINT `FKC6704E28B4E3D8B` FOREIGN KEY (`ID`) REFERENCES `IMAGES` (`ID`))
据我了解,这是在JPA尝试删除imagesShared
时发生的。 我尝试这样做:
for (Images image : userAccount.getImagesShared()){
image.setLikes(null);
}
em.remove(account);
但是同样的错误。 任何人?
更新
当我添加此行时,它工作正常。
for (Images image : userAccount.getImagesShared()){
image.setLikes(null);
}
userAccount.getImagesShared().clear();
em.remove(account);
但是,JPA与我执行的删除操作之间有什么区别?
您的private Set<Images> imagesShared
或private Set<Images> imagesLiked
必须具有对您要删除的Image的引用。
您将必须遍历所有内容并删除图像参考,然后再将其删除。
编辑:
回答第二个问题。
for (Images image : userAccount.getImagesShared()){
image.setLikes(null);
}
userAccount.getImagesShared().clear();
em.remove(account);
之所以有效,是因为您通过调用userAccount.getImagesShared().clear()
清除了userAccount
存储的图像引用userAccount.getImagesShared().clear()
以前,您只是在删除存储在该Image中的userAccount
,而不是从userAccount
对象本身删除这些图像。
private Set<Images> imagesLiked
具有对IMAGES
( ID
)的外键引用,因此,如果您要删除private Set<Images> imagesShared;
而不删除private Set<Images> imagesLiked;
。
因此,请尝试删除链接的图像
image.setImagesLinked(null);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.