0

私は双方向の 1 対多の関係を持っています。つまり、1 つの親は多くの子を持つことができ、1 つの子は 1 つの親を持つ必要があり、多くの子は同じ親を持つことができます。

次の hibernate xml 構成を参照してください。これは、オブジェクトをロードするためにうまく機能します。ID で親を選択すると、一連の子 (存在する場合) を含む親オブジェクトが正常に返されます。

ただし、新しい親を作成し、いくつかの子を追加してから、休止状態に親を作成するように依頼すると、子は一緒に保存されません。私は休止状態が私のためにそれを処理すると思っていたでしょうか?

私の問題は、親がIDとしてdb管理シーケンスを持っているため、親が挿入されるまで子が親のIDを持つことができないためだと思われます。しかし、これは休止状態が処理するのにそれほど難しくないはずですか?

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>

Child.hbm.xml;

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

結果は、親が PARENT テーブルに保存され、CHILD テーブルは空のままです。

4

1 に答える 1

0

子オブジェクトを保存するには、マッピングとカスケードを使用する必要があります。

すなわち

<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>

ここを参照してください:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/example-parentchild.html#example-parentchild-update

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html

于 2012-10-17T11:34:45.667 に答える