当前位置: 首页 > 面试题库 >

更新集合时hibernate删除orphan

唐宇定
2023-03-14
问题内容

我发现从Hibernate的集合中删除orphan记录并没有被删除。我一定在做一些简单的错误(这是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!

总而言之,我发现:

  • 从作者的藏书中删除该书后,该书仍存在于数据库中
  • 如果我检查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;
}

我仍然找到相同的结果。我必须缺少一些简单的东西。


问题答案:

你没做错什么 您只是不删除子实体。您可以通过对子实体的显式remove()进行此操作(除了您正在执行的操作),也可以使用该注释使记录被删除。

另外,值得一提的是CascadeType.DELETE也不会删除orphan。那意味着其他。

基本上,要自动执行此操作,您需要在父级的集合中使用它:

org.hibernate.annotations.CascadeType.DELETE_ORPHAN


 类似资料:
  • 我有两个类和,它们具有一对多关系。 假设我已经在我的数据库结构中持久化了,如下所示: ---编辑--- 实体不是什么花哨的东西,比如:

  • 我有一个Employee实体(Employee(id,name,company_id)): 一个公司可以有更多的员工,但一次有一个员工属于一个公司。我加入了他们(我希望获得状态为1的员工),并将cascade设置为all,但当我将员工更新为另一个公司时,该公司的employeeSet不会刷新,旧公司也不会刷新,新公司也不会刷新。这是员工的更新方法: 我也尝试过更新(雇员),但没有成功。我从代码中遗

  • 问题内容: 我在Hibernate中有标准协会。更新时,我正在创建新实体(使用关键字),并用必要的值(还插入ID)填充它。值来自UI。以相同的方式,我创建了子对象的新集合,用值(也插入了ID)填充每个子对象,并将集合存储在父对象中(使用setter或按方法)。 所以我的问题是:如何在更新父级时删除父级集合中的所有对象,并用新的集合替换它们。在新集合中,某些对象确实是新对象,而某些对象仅需要更新(它

  • 在 MongoDB 中,可以使用 drop() 方法来从数据库中删除指定集合,它会从数据库中完全删除一个集合,并且不会留下与已删除集合关联的任何索引。 drop() 方法在使用时不需要带有任何参数,并且在使用参数调用时会产生错误,该方法的语法格式如下: db.collection_name.drop() 其中 collection_name 为要删除的集合名称,方法调用成功会返回 true,否则返

  • 我有父实体和一个方向作为具有关系的子实体。我尝试使用Hibernate查询删除超过一周的广告,但得到的结果是: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(.,constraint外键()引用() 用户: 筛选器: 广告: DAO删除方法:

  • 问题内容: 我尝试将DTO对象映射到我的JPA实体。我有一个集合在我的。可以添加它们。Mapstruct通过(http://mapstruct.org/documentation/dev/reference/html/#collection- mapping- strategies )支持使用加法器。 如果创建新实体,此方法效果很好,但是在添加新子代之前,在更新时无法清除子代。 Mapstruct