我有两个类,ProductConfiguration和SubProduct。

我要替换配置中的子产品,我可以通过以下方式进行操作:

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


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

从ProductConfiguration到SubProduct的映射:

<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"/>

最佳答案

如果外键不可为空,则您可能要删除没有父项的子产品:

<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);

10-08 16:19