4

我有以下关系

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 所做的删除操作和我所做的有什么区别呢?

4

2 回答 2

6

private Set<Images> imagesSharedprivate Set<Images> imagesLiked必须引用您尝试删除的图像之一。

您必须遍历所有内容并在删除之前删除图像参考。

编辑 :

回答你的第二个问题。

 for (Images image : userAccount.getImagesShared()){
            image.setLikes(null);
        }
userAccount.getImagesShared().clear();
em.remove(account);

有效,因为您正在userAccount通过调用清除存储的图像引用userAccount.getImagesShared().clear()

以前您所做的只是删除存储在该图像中的喜欢,而不是从userAccount对象本身中删除图像。

于 2013-04-10T06:19:40.003 回答
1

private Set<Images> imagesLiked具有对 IMAGES( )的外键引用,ID因此如果您尝试删除private Set<Images> imagesShared;而不删除private Set<Images> imagesLiked;.

所以尝试删除 imagesLinked 也

image.setImagesLinked(null);
于 2013-04-10T08:49:14.760 回答