Java 更新集合时休眠删除孤立项
我发现在Hibernate中从集合中删除孤立记录时没有被删除。我一定是做错了什么事,(这是Hibernate-101!),但我找不到它 鉴于以下情况:Java 更新集合时休眠删除孤立项,java,hibernate,orphan,Java,Hibernate,Orphan,我发现在Hibernate中从集合中删除孤立记录时没有被删除。我一定是做错了什么事,(这是Hibernate-101!),但我找不到它 鉴于以下情况: public class Book { @ManyToOne @NotNull Author author; } public class Author { @OneToMany(cascade={CascadeType.ALL}) List<Book> books; } AuthorDAO代
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
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
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u ORPHAN)
,现在是:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
公共类作者
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
列出书籍;
}
我仍然发现同样的结果。我一定错过了一些简单的事情。你没有做错什么。您只是没有删除子实体。您可以使用子实体的显式remove()执行此操作(除了您正在执行的操作之外),也可以使用导致删除孤立记录的注释 另外,值得一提的是,
CascadeType.DELETE
也不会删除孤立项。那意味着别的。看
基本上,要自动执行此操作,您需要在父级中的集合上执行此操作:
org.hibernate.annotations.CascadeType.DELETE_ORPHAN
如果您想要“可传递依赖项”行为,请尝试使用以下注释
@org.hibernate.annotations.Cascade(CascadeType.DELETE\u ORPHAN)注释中的Cascade选项是一个数组,您需要的是:
@OneToMany(cascade={CascadeType.ALL, CascadeType.DELETE_ORPHAN})
请添加@onDelete,也许这是你的工作
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@OnDelete(action = OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
公共类作者
{
@OneToMany(cascade={CascadeType.ALL})
@OnDelete(action=OnDeleteAction.CASCADE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
列出书籍;
}
看起来您可能缺少mappedBy注释。尝试:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author {
@OneToMany(mappedBy="author", cascade={CascadeType.ALL})
List<Book> books;
}
公共课堂教材{
@许多酮
@NotNull
作者;
}
公共类作者{
@OneToMany(mappedBy=“author”,cascade={CascadeType.ALL})
列出书籍;
}
用于搜索解决方案的用户:现在处于Hibernate,resp。JPA 2.0,这是正确的方法:
@OneToMany(orphanRemoval=true)
我知道我来晚了,我意识到关于这个话题已经说了很多,但我不想用删除孤儿作为级联选项。我宁愿先手动删除子关联,然后再删除父关联。一个小小的疏忽。。。一长串的关联可以在一秒钟内被删除。对我同意,在某些情况下,这可能正是我想要的。我添加了此注释,但它仍然不起作用-与以前的结果相同。您是否也将书中的作者引用设置为null?不,我认为这就是DELETE_OPRHAN注释的要点?您仍然需要自己管理Java关系。这意味着如果关系是双向的,则必须在子项中将父项设置为null。Hi。这也没有效果。你是在删除后提交会话还是刷新会话?不会使用CascadeType.ALL覆盖CascadeType.delete\u孤儿吗?这个答案现在已经9岁了。这可能不再相关了。
@OneToMany(orphanRemoval=true)