Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新集合时休眠删除孤立项_Java_Hibernate_Orphan - Fatal编程技术网

Java 更新集合时休眠删除孤立项

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代

我发现在Hibernate中从集合中删除孤立记录时没有被删除。我一定是做错了什么事,(这是Hibernate-101!),但我找不到它

鉴于以下情况:

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)
  • 我最初在一个用
    @Transactional
    修饰的更新例程中遇到了这个问题,但后来我在一个普通的老JUnit测试中重新创建了它
任何建议都将不胜感激

编辑:感谢您的反馈。除了下面的评论之外,我还向父级添加了
@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)