Hibernate でコレクションから削除するときに、孤立したレコードが削除されていないことがわかりました。私は何か単純な間違いをしているに違いありません (これは Hibernate-101 です!)、しかし、私はそれを見つけることができません..
以下を考えると:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
そして、次の更新コード:
Author author = authorDAO.get(1);
Book book = author.getBooks().get(0);
author.getBooks().remove(0);
authorDAO.update(author);
著者のDAOスニペット:
@Override
public void update(T entity) {
getSession().update(entity);
}
次のテストは失敗します。
Author author = author.get(1);
assertEquals(0,author.getBooks().size()); // Passes
Book dbBook = bookDAO.get(book.getId())
assertNull(dbBook); // Fail! dbBook still exists!
assertFalse(author.getBooks().contains(dbBook) // Passes!
要約すると、私は見つけています:
- 書籍は著者の書籍コレクションから削除されますが、データベースにはまだ存在します
- を調べる
book.getAuthor().getBooks()と、そのコレクションには本がありません
これは、セッションをフラッシュしたり、適切に更新を強制したりしていないように「感じます」が、どこでそれを行うべきかわかりません。その流れに沿って、影響を与える可能性のあるその他のポイント:
- 装飾されたJUnitテストで上記を実行しています
@RunWith(SpringJUnit4ClassRunner.class) - 私は元々、 で装飾された更新ルーチン内でこの問題に
@Transactional遭遇しましたが、その後、単純な古い JUnit テストで再作成しました。
どんなアドバイスでも大歓迎です!
編集: すでにすべてのフィードバックをお寄せいただきありがとうございます。以下のコメントに加えて@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)、親に を追加したので、次のようになりました。
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
私はまだ同じ結果を見つけています。シンプルなものが欠けているに違いありません。