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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top