Hibernate的更新集合时,删除孤儿(Hibernate deleting orphans wh

2019-07-02 11:54发布

我发现把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;
}

我仍然发现了同样的结果。 我一定是简单的东西。

Answer 1:

你没有做错什么。 你只是不删除子实体。 您可以与孩子实体(除了你在做什么)的一个显式删除()做到这一点,或使用注释导致孤立记录被删除。

此外,值得一提的是, CascadeType.DELETE不会删除孤儿无论是。 这意味着别的东西。 见JPA CascadeType.ALL不会删除孤儿。

基本上做到这一点自动,你会想这对父集合:

org.hibernate.annotations.CascadeType.DELETE_ORPHAN


Answer 2:

在休眠现在,RESP:为人们寻找自己的解决方案。 JPA 2.0,这是正确的做法:

@OneToMany(orphanRemoval=true)


Answer 3:

在级联选项@OneToMany注解是一个数组,你想要的是:

@OneToMany(cascade={CascadeType.ALL, CascadeType.DELETE_ORPHAN})


Answer 4:

尝试使用以下annoation如果你想“传递依赖”水煤浆。

@ org.hibernate.annotations.Cascade(CascadeType.DELETE_ORPHAN)



Answer 5:

请加@onDelete也许这对你的工作

public class Author
{
    @OneToMany(cascade={CascadeType.ALL})
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    List<Book> books;
}


Answer 6:

看起来你可能会错过的mappedBy注解。 尝试:

public class Book {
  @ManyToOne
  @NotNull
  Author author;
}
public class Author {
  @OneToMany(mappedBy="author", cascade={CascadeType.ALL})
  List<Book> books;
}


文章来源: Hibernate deleting orphans when updating collection