1

このトピックに関する多くの投稿を読みましたが、解決できませんでした =(

1 対多の関係にある親とその子を保存しようとしています。私は、他の投稿からのドキュメントやその他の提案に従っていると信じています。ただし、私が抱えている問題は、Hibernate が子レコードを保存しようとすると、実際の ID ではなく、親への FK に「0」を挿入することです。

親 hbm.xml マッピング

<hibernate-mapping>
<class name="ParentClass" table="PARENTTABLE">
    <id name="parentid" type="java.lang.Long">
        <column name="PARENTID" precision="15" scale="0" />
        <generator class="sequence">
            <param name="sequence">S_PARENTTABLE</param>
        </generator>
    </id>
...
    <set name="children" table="CHILDTABLE" inverse="true" lazy="true" fetch="select" cascade="all">
        <key>
            <column name="PARENTID" precision="15" scale="0" not-null="true" />
        </key>
        <one-to-many class="ParentClass" />
    </set>
...
</class>
</hibernate-mapping>

子 hbm.xml マッピング

<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
    <composite-id name="id" class="ChildClassId">
        ....
        <key-property name="parentid" type="long">
            <column name="PARENTID" precision="15" scale="0" />
        </key-property>
    </composite-id>
    <many-to-one name="parent" class="ParentClass" update="false" insert="false" fetch="select">
        <column name="PARENTID" precision="15" scale="0" not-null="true" />
    </many-to-one>
....
</class>
</hibernate-mapping>

オブジェクトを保存する Java コード

private myMethod(ParentClass p, HashSet<ChildClass> children){
    for(ChildClass child : children){
        child.setParent(p);
    }
    p.setChildren(children);  //The parameter type is Set<ChildClass>   
    sess.save(p);
    ...
}

したがって、親オブジェクトを正しい ID (次の seq 値、たとえば 273) で保存しますが、子オブジェクトを保存しようとすると、273 を使用する代わりに 0 を使用するだけです。

Hibernate で子オブジェクトを正しい ParentId (FK) で保存する方法がわかりません。

あなたが提供できる助けやアイデアは大歓迎です!前もって感謝します!

** UPDATE ** 子テーブルの FK が正しい値で挿入されていない理由がようやくわかりました。マッピング定義が原因でした。DB でリバース エンジニアを実行し、[基本型の複合 ID を生成する] というボックスをオンにしました。これにより、Hibernate は複合キー列をエンティティへの参照ではなくプリミティブ型としてマップします。挿入を行ったとき、これはどういうわけかそれを混乱させました。

正しい子テーブル マッピングは次のようになります。

更新された子 hbm.xml マッピング

<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
    <composite-id name="id" class="ChildClassId">
        ....
        <key-many-to-one name="parentid" class="ParentClass" >
            <column name="PARENTID" precision="15" scale="0" />
        </key-many-to-one>
    </composite-id>
</class>
</hibernate-mapping>

前のタグの代わりにタグに注目してください。また、 の外側のタグはなくなりました (というか、タグとして id に移動されました)。

4

1 に答える 1

0

あなたの場合、親クラスの1対多のマッピング定義で逆プロパティをfalseに設定する必要があると思います。これは、親エンティティが子テーブルの FK の更新を担当することを意味します。このような場合、hibernte は、親エンティティを保存した後、子テーブルの FK を更新するための追加の更新ステートメントを実行します。

<set name="children" inverse="false" lazy="true" fetch="select" cascade="all">
       <key>
           <column name="PARENTID" precision="15" scale="0" not-null="true" />
       </key>
       <one-to-many class="ParentClass" />
</set>
于 2012-08-15T06:09:38.677 に答える