2

注意:我正在使用J2EE Spring MVC + Hibernate,同時爲此使用註釋。手動遞歸刪除在休眠中拋出「已刪除的實例傳遞給合併」

我有一個文件系統建模在休眠與這些文件夾中的文件夾和文件的層次結構。每個文件夾都引用其父文件夾,如果它們是根文件夾,則爲null。他們沒有引用他們的孩子,因爲那裏有一些多態性,我決定最好查詢來檢索孩子。無論如何,結合我需要使用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) 

如何解決此問題?

+0

除了來自子女的關係之外,您還有其他任何與您的文件和文件夾的關係嗎?你是否在同一個事務中執行其他持久化操作? – axtavt 2011-01-12 18:55:27

回答

2

我現在覺得有點傻,我知道答案。我打電話「刪除(文件夾)」;「在我調用遞歸函數之後,意味着代碼嘗試刪除文件夾兩次。