ПРИМЕЧАНИЕ. Я использую 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)
Как мне это исправить?