在一对多单向hibernate映射中删除

在一对多单向hibernate映射中删除,hibernate,jpa,Hibernate,Jpa,在单向hibernate映射中删除父级的最佳实践是什么?(我正在使用JPA) 家长: @OneToMany(mappedBy=“parent”,fetch=FetchType.LAZY) private List children=new ArrayList(); 儿童: @manytone(fetch=FetchType.LAZY) @JoinColumn(name=“fk_父项”) 私人家长; Child是此处关系的所有者,我想删除一个与子项关联的父项。我如何做到这一点?我是否应该继续从父

在单向hibernate映射中删除父级的最佳实践是什么?(我正在使用JPA)

家长:
@OneToMany(mappedBy=“parent”,fetch=FetchType.LAZY)
private List children=new ArrayList();
儿童:
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“fk_父项”)
私人家长;

Child是此处关系的所有者,我想删除一个与子项关联的父项。我如何做到这一点?我是否应该继续从父级逐个迭代子级并删除它们,或者存在其他方法。不幸的是,在hibernate文档中找不到任何关于删除的内容。

因此,实际上,您的关联是双向的,而不是单向的

如果您的目标是在删除父对象时删除子对象,那么您只需要

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Child> children= new ArrayList<Child>();

天哪!发现了问题。这与cascade无关,不过cascade是需要的。问题在于我将子项添加到父项并删除它们的方式。综上所述:

如果我对父项执行保存以创建关联:

parent.addChild(child)  
em.save(parent)
然后我必须在删除时从父级进行操作。或者,如果我将child添加为

child.setParent(parent)
em.save(child)

然后我必须对child进行操作以删除它,等等。

如果我现在有另一个父项,Parent1与child具有相同的关系(就像父项一样),该怎么办。我可以在不担心子-父关系的情况下删除父项1吗?em.remove(parent)在添加级联后不起作用,抛出“无法删除或更新父行:外键约束失败…”我收到此错误“外键约束失败…”始终以一对多的双向方式进行,并且无法通过它。。。我已经提供了所有的级联类型,但没有结果。哪个外键约束失败了?您确定没有任何外键指向父级的行吗?Hibernate执行的SQL查询是什么?是的,我确实有一行的父项带有fk。我假设cascade(cascade=CascadeType.ALL或REMOVE)将在执行em.REMOVE(parent)时删除所有子级。查看了hibernate执行的SQL查询,没有为子行发出删除!!令人惊讶的是,我确实看到为其他类型的孩子(与父母有相同的一对多关系)发布的delete语句!为什么会这样?我看不出映射其他子类的方式有什么不同。EntityManager中没有save()方法。实体的保存方式(可能是几年前,也可能是使用Hibernate以外的东西)对您必须如何删除它没有任何影响。是的,我知道。这很奇怪,至少在我的环境中。然而,当我重新部署时,事情就开始工作了,我想所有关联都会正确同步。[将用持久化替换保存]
parent.addChild(child)  
em.save(parent)
child.setParent(parent)
em.save(child)