Hibernate Mapping:在hibernate中删除一对多双向映射中的子节点

时间:2015-02-09 17:04:42

标签: hibernate hibernate-mapping hbm hibernate-onetomany bidirectional-relation

我有一个父对象及其详细对象。 下面的代码中提到了映射 -

父对象映射

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class lazy = "false" name="com.test.model.Parent" table="parent">
        <id name="parentId" column="PARENT_ID" type="long">
            <generator class="sequence">
                <param name="sequence">PARENT_ID_SEQ</param>
            </generator>
        </id>
        <set 
            name="childSet" 
            lazy="false" 
            cascade="all-delete-orphan" 
            inverse="true" 
            table = "child" 
            order-by = "CHILD_ID"
            >
            <key column="PARENT_ID"/>
            <one-to-many class="com.test.model.Child"/>
        </set>
    </class>
</hibernate-mapping>

子对象映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.test.model.Child" table="hot_Cash_coupon">
        <id name="childId" column="CHILD_ID" type="long">
            <generator class="sequence">
                <param name="sequence">CHILD_ID_SEQ</param>
            </generator>
        </id>
        <many-to-one name="parent"
            class="com.test.model.Parent" column="PARENT_ID" not-null="true" />
    </class>
</hibernate-mapping>

我可以用3个孩子来保存新的父母。 现在,在更新操作中,

在parent.childSet中,我将删除所有值并设置新值。 当我做session.update(父)时,我的要求是,

  1. 删除父项的所有现有子项 - 因为parent.childSet没有它们。
  2. 插入parent.childSet中可用的新值。
  3. 这里,parent.childSet表示在父类/ HBM映射中设置。

    现在发生的问题是,

    1. 抛出异常 - &#34;无法插入NULL(&#34; CHILD&#34;。&#34; PARENT_ID&#34;)&#34;
    2. 如果不清楚,我会不断更新问题。

      谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

暂时我正在做session.update(父)。这使CHILD表中存在的外键和孤立记录无效。在我手动完成了孤儿的session.delete(...)之后。

这更像是一种解决方法而非解决方案。