所以我有两个类 :File
和FileSet
,它们具有由连接表链接的双向多对多关系FILE_FILE_SET
。
一个文件可以是许多文件集的一部分,反之亦然。对文件集的更改通过@ManytoMany(cascade = CascadeType.All)
注释级联到单个文件(但不是相反)。特别是,在 FileSet 中遇到超过 1000 个文件的情况并不少见。我们已经启动并运行了这些类的代码,但是当我们尝试从 FileSets 中删除单个文件时遇到问题:虽然删除正确发生,但随着集中文件数量的增加,删除所需的时间与 O 成比例(n^2)。这是因为删除 FileSet-File 关联的当前代码获取 FileSet 的一个实例,删除 File,然后使用 保存更新的 FileSet SaveOrUpdate()
,这反过来又保存了所有关联的文件。
这对于小型集合很好,但当 FileSet 中有许多文件时会变得非常慢。不幸的是,FileSet 对象保存在代码中的许多其他点,级联是一件好事,所以我宁愿不完全关闭级联。
所以,要解决我的实际问题:休眠中有没有办法删除两个对象之间的特定关联?例如,是否可以运行 HQL 查询来从连接表中删除条目?