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)

これを修正するにはどうすればよいですか?

4

1 に答える 1

2

答えを知った今、ちょっとばかげているような気がします。「remove(folder);」と呼んでいました。再帰関数を呼び出した後、コードがフォルダーを2回削除しようとしたことを意味します。

于 2011-02-03T19:40:05.117 に答える