Java 休眠,一对多,未插入父级的子级

Java 休眠,一对多,未插入父级的子级,java,hibernate,Java,Hibernate,我有一个双向的一对多关系,即一个父母可以有许多孩子,一个孩子必须有一个父母,许多孩子可以有同一个父母 请参阅下面的HibernateXML配置。这适用于加载对象。通过父对象的id选择父对象将成功返回包含其子对象集(如果有)的父对象 但是,当我创建一个新的父级时,添加一些子级,然后要求hibernate创建父级,子级不会随父级一起保存。我本以为hibernate会帮我处理的 我怀疑我的问题是因为父对象有一个db管理的序列作为id,所以在插入父对象之前,子对象不能拥有父对象的id。但这对hibern

我有一个双向的一对多关系,即一个父母可以有许多孩子,一个孩子必须有一个父母,许多孩子可以有同一个父母

请参阅下面的HibernateXML配置。这适用于加载对象。通过父对象的id选择父对象将成功返回包含其子对象集(如果有)的父对象

但是,当我创建一个新的父级时,添加一些子级,然后要求hibernate创建父级,子级不会随父级一起保存。我本以为hibernate会帮我处理的

我怀疑我的问题是因为父对象有一个db管理的序列作为id,所以在插入父对象之前,子对象不能拥有父对象的id。但这对hibernate来说应该不会太难处理,是吗

Parent.hbm.xml

<hibernate-mapping default-cascade="none">
    <class name="com.mydomain.ParentImpl" table="PARENT" dynamic-insert="false" dynamic-update="false">
        <id name="id" type="java.lang.Long" unsaved-value="null">
            <column name="ID" sql-type="BIGINT"/>
            <generator class="sequence">
                <param name="sequence">PARENT_SEQ</param>
            </generator>
        </id>
        ....
        lots of other properties
        ...
        <set name="children" lazy="true" fetch="select" inverse="true">
            <key foreign-key="parent_child_fkc">
                <column name="PARENT_FK" sql-type="BIGINT"/>
            </key>
            <one-to-many class="com.mydomain.ChildImpl" not-found="exception"/>
        </set>
   </class>
</hibernate-mapping>

结果是父表保存到父表,子表保持为空。

您需要使用映射和级联来保存子对象

i、 e


请看这里:


谢谢,我已经做了您建议的更改,基本上cascade=“all delete orphan”就是我需要的。但是,我现在得到一个PropertyValueException,因为Child.parent_fk在保存子对象时为null。这是因为Parent.id只有在被插入时才被设置,而hibernate没有将其分配给Child.Parent_fk字段?不要紧,该异常是因为代码在从VO转换到域对象时没有正确设置Child.Parent对象关系。
<hibernate-mapping default-cascade="none">
    <class name="com.mydomain.ChildImpl" table="CHILD" dynamic-insert="false" dynamic-update="false">
        <id name="id" type="java.lang.Integer" unsaved-value="null">
            <column name="ID" sql-type="INTEGER"/>
            <generator class="sequence">
                <param name="sequence">child_seq</param>
            </generator>
        </id>
        <many-to-one name="parent" class="com.mydomain.ParentImpl" foreign-key="parent_child_fkc" not-null="true" lazy="proxy" fetch="select">
            <column name="PARENT_FK" not-null="true" sql-type="BIGINT"/>
        </many-to-one>
        ...
        lots of other properties
        ...
    </class>
</hibernate-mapping>
public void addChild(Child child){
    if(children == null) {
        children = new HashSet<Child>();
    }
    children.add(child);
    child.setParent(this);
}
Parent parent = new Parent();
parent.addChild(new Child());
parent.addChild(new Child());
getHibernateTemplate().save(parent);
<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>