2012-01-12 66 views
0

我有两个类,ProductConfiguration和SubProduct。休眠和从列表中删除

我要替换的配置中的子产品,我这样做:

productConfiguration.getSubProducts().clear(); 
productConfiguration.getSubProducts().addAll(newSubProducts); 

在这一过程中,Hibernate的尝试设置父(产品配置)为空的ID,并然后更新数据库中的行。这会失败,因为父ID是外键,因此不能为空。

从ProductConfiguration映射到子产品:

<bag name="subProducts" 
    table="sub_product" 
    cascade="all-delete-orphan" 
    access="field" 
    lazy="false"> 
    <key column="parent_id"/> 
    <one-to-many class="com.conscius.cpt.core.product.SubProduct"/> 
</bag> 

<many-to-one name="parentProduct" 
      class="com.conscius.cpt.core.product.ProductConfiguration" 
      column="parent_id" 
      access="field" 
      not-null="true" 
      cascade="none"/> 
+1

当子产品被删除时,您是否打算将子产品存在于数据库中?如果没有,看看这个:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir – zmf 2012-01-12 15:13:28

+0

我看到我错了什么地方。我错过了ProductConfiguration一侧的逆向语句。我会尽快添加答案。 – SimonPip 2012-01-12 15:26:50

回答

0

这里的解决方案是si mple。我忘了在产品配置一侧添加一个反向语句。

<bag name="subProducts" 
    table="sub_product" 
    cascade="all-delete-orphan" 
    access="field" 
    lazy="false"> 
    <key column="parent_id"/> 
    <one-to-many class="com.conscius.cpt.core.product.SubProduct"/> 
</bag> 
1

如果外键不可为空,你可能想要删除它没有父子产品:

<bag name="subProducts" cascade="all-delete-orphan" ... 

更新:防止更新你可以做的外键

<bag name="subProducts" inverse="true" ... 

// and 
for (SubProduct sub : productConfiguration.getSubProducts()) 
{ 
    sub.setParentProduct(null); 
} 
productConfiguration.getSubProducts().clear(); 
productConfiguration.getSubProducts().addAll(newSubProducts); 
+0

是的,对不起,我确实有过这种情况,但认为这可能是问题所在。它不是,我已经重新插入了删除孤立部分。 – SimonPip 2012-01-12 15:28:35