2

注:J2EE Spring MVC + Hibernateを使用しています。手動再帰的削除は、休止状態の "削除されたインスタンスをマージするために渡された"をスローします

私は、これらのフォルダ内のフォルダとファイルの階層を持つ休止状態でモデル化されたファイルシステムを持っています。フォルダはそれぞれ親フォルダを参照し、ルートフォルダの場合はnullを参照します。多形性があるので、子どもへの参照はありません。子供を検索するためにクエリするのが最善であると判断しました。それにもかかわらず、データベースの履歴を追跡するためにMySQLトリガを使用する必要があるという事実と組み合わせれば、カスケード削除はオプションではないということを意味します。

その結果、手動で削除する必要があります。

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

:DAOは、クラスの最上部に置かれ、次のトランザクションの注釈を持っているサービスによって呼び出されていますか?

+0

子供からの関係を除いて、ファイルやフォルダとの関係は他にありますか?同じトランザクションで他の永続化操作を実行していますか? – axtavt

答えて

2

私は答えを知っているので、今はばかげています。私は "remove(folder)"と呼んでいた。再帰関数を呼び出すと、コードがそのフォルダを2回削除しようとしたことを意味します。

関連する問題