手动递归删除在hibernate中抛出“已删除的实例传递给合并”

时间:2011-01-12 18:21:16

标签: hibernate spring-mvc java-ee spring-annotations spring-transactions

注意:我正在使用J2EE Spring MVC + Hibernate,同时使用注释。

我有一个在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
}

不幸的是,我继续将#34;已删除的实例传递给合并&#34;尝试提交事务中的更改时发生异常。 DAO由一个服务调用,该服务在类的顶部放置了以下事务注释:

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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