我发现在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);
AuthorDAO代码片段:
@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(),则该书不会存在于该集合中。
这种感觉就像我没有适当地刷新会话或强制更新——但是我不确定我应该在哪里做到这一点。其他可能影响的方面如下:
- 我在装饰有@RunWith(SpringJUnit4ClassRunner.class)的JUnit测试中执行了以上操作。 - 最初我在一个带有@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;
}
我仍然得到相同的结果。我一定是漏了什么简单的东西。