2013-08-21 140 views

回答

14

没有映射结束代码有点困难... 这是由于您正在删除与某个集合关联的对象而导致的。
你必须从拥有集合(S)删除对象,之后,删除对象

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

但是你可以这样使用deleteOrphan来映射集合这样

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

避免和代码看起来像

parentObject.collection.remove(objToDelete); 
session.save(parentObject); 

您不需要删除对象,因为它在保存parentObject时被Hibernate自动删除。

希望能帮助

+1

hibernate用户应该使用这个方法去除孤儿@Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) – Akhilesh

5

您已删除会话的实体(A),但它是由另一个实体引用,并anotated与级联注解。该参考将导致实体(A)立即重新处理。由于这可能不是你想要的,所以hibernate抱怨。

解决的办法是找到实体可以通过的所有引用(包括集合),并将它们设置为null /从集合中删除实体。

你可以把你的删除逻辑放在一边:让参考(如果只有一个)删除孤儿,然后在@bellabax中删除它。

2

这个异常告诉你正在删除的对象也被映射为任何实体的集合,并且你的集合中的级联id全部都是。所以,如果你想删除的任何方式,您可以将您的级联改变

cascade = CascadeType.DETACH 
0

如果您通过XML这样做(而不是注解),以下是为我工作的解决方案:

一到 - 许多社团:

  1. 从 父对象[注的所有集合中删除的子对象的任何链接:如果你正在做一一对一的关联,只是 设置父对象的子对象的引用到“空白”]
  2. 从数据库中删除的子对象
  3. 冲洗使用调用Session.flush()
  4. 链接父对象到新的子对象
  5. 保存父对象6)变更提交更改

小心:会话。因为Hibernate需要查看更改,所以flush()非常重要,如果不能刷新会话,我会建议您在不同的事务中执行步骤(1,2),然后执行步骤(4,5, 6)在新的交易中。

相关问题