java - 更新集合时 hibernate 删除孤儿

标签 java hibernate orphan

我发现从 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!

总之,我发现:

  • 虽然图书已从作者的图书 Collection 中删除,但它仍存在于数据库中
  • 如果我检查 book.getAuthor().getBooks(),则该集合中不存在这本书

这种“感觉”就像我没有适本地刷新 session 或强制更新 - 但我不确定我应该在哪里这样做。沿着这条脉络,其他可能会产生影响的点:

  • 我在用 @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;
}

我仍然发现相同的结果。我一定错过了一些简单的东西。

最佳答案

对于寻找解决方案的人:现在在 Hibernate 中,分别。 JPA 2.0,这是正确的方法:

@OneToMany(orphanRemoval=true)

关于java - 更新集合时 hibernate 删除孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304862/

相关文章:

java - 如何将标签参数从 JSP 发送到 servlet?

java - 在下面的代码里面实现ActionListener

java - 重要的 Java EE Web 服务实现示例?

java - Spring 数据 JPA : Batch insert for nested entities

java - Spring - hibernate 错误

java - Hibernate 和 JPA,用什么,用在哪里?

css - 如何通过删除不匹配和/或不必要的 CSS 选择器来优化我的样式表

mysql多对多删除级联留下孤儿

java - 一个注释怎么可能是它自己的注释呢?

linux - Ubuntu 16.04 显示孤儿进程的父 ID 4147