2

注意:我使用的是 J2EE Spring MVC + Hibernate,两者都为此使用了注释。

我有一个在休眠中建模的文件系统,其中包含文件夹和这些文件夹中的文件的层次结构。每个文件夹都引用其父文件夹,如果它们是根文件夹,则为 null。他们没有对他们的孩子的引用,因为那里有一点多态性,我决定最好通过查询来检索孩子。无论如何,再加上我需要使用 MySQL 触发器来跟踪数据库中的历史记录,这意味着不能选择级联删除。

结果我必须手动删除东西。现在,递归逻辑似乎相当简单,我所要做的就是在文件夹 DAO 中执行以下操作:

// Pseudo-java-code
deleteFolder(Folder folder)
{
  Set<Folder> folders = getFoldersInFolder(folder);
  for (Folder child:folders) {
    deleteFolder(child);
  }
  Set<File> files = fileDAO.getFilesInFolder(folder);
  for (File f:files) {
     fileDAO.deleteFile(f);
  }
  remove(folder); // method from org.execution.dao.JpaDao
}

不幸的是,当它尝试提交事务中的更改时,我不断收到“已删除的实例传递给合并”异常。DAO 被一个服务调用,该服务在类的顶部放置了以下事务注释:

@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)

我该如何解决?

4

1 回答 1

2

现在我知道答案了,我觉得有点傻。我正在调用“删除(文件夹);” 在我调用递归函数之后,这意味着代码尝试删除文件夹两次。

于 2011-02-03T19:40:05.117 回答