Manuale di cancellazione ricorsiva tiri “istanza cancellato passato a fondersi” in ibernazione
-
10-10-2019 - |
Domanda
. NOTA: Sto usando un J2EE Spring MVC + Hibernate con entrambi utilizzano le annotazioni di questo
Ho un file system modellato in ibernazione con una gerarchia di cartelle e file in queste cartelle. Le cartelle ciascun riferisce alla loro cartella principale o nullo se sono una cartella principale. Non hanno i riferimenti ai loro figli dal momento che c'è un po 'di polimorfismo lì e ho deciso che sarebbe stato meglio per query per recuperare i bambini. Indipendentemente da ciò, che combinato con il fatto che ho l'obbligo di trigger usare MySQL per tracciare la storia nel database, significa che il sovrapporsi di eliminazione non è un'opzione.
Di conseguenza devo eliminare le cose manualmente. Ora, la logica ricorsiva per questo sembra abbastanza semplice, tutto quello che ho dovuto fare è quanto segue nella DAO cartella:
// 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
}
Purtroppo continuo a ricevere il "istanza eliminata passato a fondere" eccezione quando si tenti di commettere i cambiamenti nella transazione. DAO viene chiamato da un servizio che ha la seguente annotazione transazionale posto alla sommità della classe:
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
Come posso risolvere questo problema?
Soluzione
mi sento sorta di stupida ora che conosco la risposta. Mi chiamavo "remove (cartella);" dopo la mia chiamata alla funzione ricorsiva, il che significa che il codice ha tentato di rimuovere la cartella per due volte.