我发现把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()
书上没有该集合中存在
这种“感觉”像我不冲洗会话或适当强制更新 - 但是我不知道,我应该这样做。 沿着静脉,其他点可能影响:
- 我执行上述的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;
}
我仍然发现了同样的结果。 我一定是简单的东西。