Pregunta

NOTA:. Estoy utilizando un J2EE Spring MVC + Hibernate con ambos utilizando anotaciones de este

Tengo un sistema de archivos modelado en hibernación con una jerarquía de carpetas y archivos de estas carpetas. Las carpetas se refiere cada uno a su carpeta principal o nula si son de una carpeta raíz. Ellos no tienen referencias a sus hijos ya que hay un poco de polimorfismo allí y yo decidimos que sería mejor consulta para recuperar los niños. Independientemente, que combinado con el hecho de que tengo un requisito a los disparadores uso de MySQL para realizar un seguimiento de la historia en la base de datos, medios que eliminación en cascada no es una opción.

Como resultado tengo que eliminar manualmente las cosas. Ahora, la lógica recursiva de esto parece bastante sencillo, lo único que debería tener que hacer es lo siguiente en la carpeta 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
}

Por desgracia me siguen dando la "instancia borrada pasó a fusionarse" excepción cuando se trate de cometer los cambios en la transacción. La DAO está siendo llamado por un servicio que tiene la siguiente anotación transaccional colocado en la parte superior de la clase:

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

¿Cómo puedo solucionar esto?

¿Fue útil?

Solución

Me siento un poco tonto ahora que sé la respuesta. Estaba llamando "remove (carpeta);" después de mi llamada a la función recursiva, lo que significa que el código intentó quitar la carpeta dos veces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top