Hibernate手动删除特定的Many-Many关联

时间:2012-12-14 09:09:37

标签: java hibernate jpa

所以我有两个类:FileFileSet,它们具有通过连接表FILE_FILE_SET链接的双向多对多关系。

一个文件可以是许多文件集的一部分,反之亦然。对FileSets的更改通过@ManytoMany(cascade = CascadeType.All)注释级联到单个文件(但不是相反)。特别是,在FileSet中遇到> 1000个文件并不罕见。我们已经启动并运行了这些类的代码,但是当我们尝试从FileSets中删除单个文件时遇到问题:当删除正确时,随着集合中文件数量的增加,删除所需的时间与O一起缩放(N ^ 2)。这是因为用于删除FileSet-File关联的当前代码获取FileSet的实例,删除文件,然后使用SaveOrUpdate()保存更新的FileSet,从而保存所有关联的文件。

这对于小集合很好,但是当FileSet中有很多文件时会限制性地变慢。不幸的是,FileSet对象被保存在代码中的许多其他点,其中级联是一件好事,所以我不想完全关闭级联。

所以,要达到我的实际问题:hibernate中是否有一种方法可以删除两个对象之间的特定关联?例如,我是否可以运行HQL查询来从连接表中删除条目?

1 个答案:

答案 0 :(得分:2)

首先,ManyToXxx关联上的CascadeType.ALL没有多大意义。如果文件集的文件是另一个文件集的一部分,则在删除文件集时不希望删除所有文件,因为它们仍然被其他文件集引用。

现在,要回答这个问题,您希望它从文件集中删除文件。这可以通过从文件集中的文件集合中删除文件来完成:

public removeFilesFromFileSet(FileSet fileSet, Set<File> filesToRemove) {
    fileSet.getFiles().removeAll(filesToRemove);
}

但是这会加载FileSet中的所有文件。如果您不想这样,那么您必须映射关联表,或使用SQL。