0

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

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

这对于小型集合很好,但当 FileSet 中有许多文件时会变得非常慢。不幸的是,FileSet 对象保存在代码中的许多其他点,级联是一件好事,所以我宁愿不完全关闭级联。

所以,要解决我的实际问题:休眠中有没有办法删除两个对象之间的特定关联?例如,是否可以运行 HQL 查询来从连接表中删除条目?

4

1 回答 1

2

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

现在,要回答这个问题,您希望它从文件集中删除什么文件。这只需从文件集中的文件集合中删除文件即可完成:

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

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

于 2012-12-14T09:15:23.393 回答