【发布时间】:2010-11-21 06:00:04
【问题描述】:
我发现从 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 sn-p:
@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 测试中重新创建了它。
任何建议将不胜感激!
编辑:已经感谢所有反馈。除了下面的 cmets,我还向父级添加了 @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN),所以现在是:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
我仍然发现相同的结果。我一定错过了一些简单的东西。
【问题讨论】: