手動の再帰削除スロー「削除されたインスタンスがマージするために渡されたインスタンス」
-
10-10-2019 - |
質問
注:私はJ2EEスプリングMVC + Hibernateを使用しており、両方とも注釈を使用しています。
これらのフォルダーにフォルダーとファイルの階層を備えたHibernateでモデル化されたファイルシステムがあります。フォルダーはそれぞれ、ルートフォルダーの場合、親フォルダーまたはnullを指します。そこには少し多型があるので、彼らは子供たちへの言及を持っていません。私は子供を回収するために照会することが最善であると判断しました。とにかく、それは私がMySQLトリガーを使用してデータベース内の履歴を追跡する要件があるという事実と組み合わせることで、Cascading Deleteがオプションではないことを意味します。
その結果、私は手動で物事を削除する必要があります。さて、このための再帰ロジックはかなり簡単に思えます。私がしなければならないのは、フォルダー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)
これを修正するにはどうすればよいですか?
解決
答えを知っているので、私はちょっとばかげています。私は「remove(folder);」と呼んでいました。再帰関数を呼び出した後、コードがフォルダーを2回削除しようとしたことを意味します。
所属していません StackOverflow