Frage

. HINWEIS: Ich bin mit einem J2EE Spring MVC + Hibernate mit beiden mit Anmerkungen für diesen

Ich habe ein Dateisystem in Hibernate modellierte mit einer Hierarchie von Ordnern und Dateien in diesen Ordnern. Die Ordner jeder bezieht sich auf ihre übergeordneten Ordner oder null, wenn sie ein Stammordner sind. Sie haben keine Hinweise auf ihre Kinder, da es ein wenig Polymorphismus gibt es und ich beschlossen, es am besten zu Abfrage würde Kinder zurückzuholen. Unabhängig davon, dass zusammen mit der Tatsache, dass ich eine Anforderung zur Verwendung von MySQL Trigger Geschichte zu verfolgen, in der Datenbank haben, bedeutet, dass löschen Cascading ist keine Option.

Als Ergebnis muss ich Dinge manuell löschen. Nun wird die rekursive Logik für diese scheint ziemlich einfach, alles, was ich zu sollte die im Ordner DAO Folgendes tun:

// 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
}

Leider halte ich die „gelöschte Instanz übergeben zu fusionieren“ getting Ausnahme, wenn es um die Änderungen in der Transaktion zu begehen versucht. Die DAO wird von einem Dienst aufgerufen, die folgende Transaktions Annotation an der Spitze der Klasse platziert hat:

@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)

Wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Ich fühle mich irgendwie albern jetzt, dass ich die Antwort wissen. Ich rufe „remove (Ordner);“ nach meinem Aufruf der rekursiven Funktion, was bedeutet, dass der Code die Ordner zweimal zu entfernen versucht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top