Ручное рекурсивное удаление выдает «удаленный экземпляр, переданный для слияния» в спящий режим - PullRequest
2 голосов
/ 12 января 2011

ПРИМЕЧАНИЕ. Я использую J2EE Spring MVC + Hibernate, для чего используются аннотации.

У меня есть файловая система, смоделированная в спящем режиме с иерархией папок и файлов в этих папках. Каждая из папок ссылается на свою родительскую папку или равна нулю, если они являются корневой папкой. У них нет упоминаний о своих детях, так как там есть немного полиморфизма, и я решил, что было бы лучше запросить, чтобы найти детей. Несмотря на это, в сочетании с тем, что у меня есть требование использовать триггеры 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)

Как мне это исправить?

1 Ответ

2 голосов
/ 03 февраля 2011

Теперь я чувствую себя немного глупо, когда знаю ответ. Я звонил "удалить (папка);" после моего вызова рекурсивной функции, то есть код пытался удалить папку дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...