我发现从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()
,那本书不存在该书这种“感觉”就像我没有刷新会话或适当地强制进行更新-但我不确定应该在哪里进行。沿着这种脉络,可能会影响其他方面:
@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