繁体   English   中英

JPA:删除时的外键约束

[英]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> imagesSharedprivate 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具有对IMAGESID )的外键引用,因此,如果您要删除private Set<Images> imagesShared; 而不删除private Set<Images> imagesLiked;

因此,请尝试删除链接的图像

image.setImagesLinked(null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM