注:私は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)
これを修正するにはどうすればよいですか?