注意:我正在使用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)
我该如何解决这个问题?
答案 0 :(得分:2)
现在我知道答案,我觉得有点傻。我叫“删除(文件夹);”在我调用递归函数之后,意味着代码试图删除文件夹两次。