0

ResultテーブルとResultAuxテーブルの間にOneToMany接続があります。Resultから一連のResultAuxオブジェクトを取得できます。その後、いくつかのResultAuxオブジェクトを設定に追加し、各設定エントリでマージを使用して変更をデータベースにフラッシュします。このような:

Set<ResultAux> resultAuxes = result.getResultAuxes();
if (resultAuxes != null) {
    for (ResultAux resultAux : resultAuxes) {
        resultAux = getDaoFactory().getResultAuxDAO().merge(resultAux);
    }
}

私が知る必要のあるいくつかの追加のアクションについては、新しいレコードを設定してテーブルに挿入するか、古いレコードであり(変更されているかどうかに関係なく)更新されます。ResultAuxセットのすべてのエントリにすでにIDがあることに気付いたので、他のテーブルの場合のようにnullをチェックできません。そのようなことを決定する方法はありますか(できれば余分なライブラリを含まない)?

編集

<hibernate-mapping>
    <class name="ResultAux" table="RESULT_AUX">
        <id name="id" column="ID">
            <generator class="native" />
        </id>

        <property name="additinalInfoType" column="AITYPE" type="dao.hibernate.utl.AdditinalInfoEnumType" />
        <property name="sorter" column="SORTER" />
        <property name="value1" column="VAL1" />
        <property name="value2" column="VAL2" />

        <many-to-one name="result" column="RESULT_ID" class="Result" />
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="Result" table="RESULT">
        <id name="id" column="ID">
            <generator class="native" />
        </id>

        <property name="questionNumber" column="Q_NUM" />
        <property name="answerNumber" column="A_NUM" />
        <property name="questionGroup" column="Q_GRP" />
        <property name="answerValue" column="A_VAL" />
        <set name="resultAuxes" inverse="true" cascade="all-delete-orphan"
            lazy="false">
            <key column="RESULT_ID" />
            <one-to-many class="ResultAux" />
        </set>
    </class>
</hibernate-mapping>
4

2 に答える 2

0

私の答えがあなたの問題を解決するかどうかはわかりませんが、@ EugenioCuevasのコメントに戻るために、私はあなたの子エンティティを永続化するために次のようなことをしたでしょう:

Set<ResultAux> resultAuxes = result.getResultAuxes();
if (resultAuxes != null) {
    for (ResultAux resultAux : resultAuxes) {
        resultAux.setResult(result);
    }
}
getDaoFactory().getResultDAO().merge(result);

その後、Hibernateは独自に関係を管理する必要があります。

于 2012-05-07T08:03:16.553 に答える
0

native主キー生成戦略として 使用すると、Hibernateはidentitysequenceまたはhilo基盤となるDBの機能に応じてPK生成戦略としてを選択します。

あなたのDBの場合、hibernateは次のコードによってこの問題が発生する可能性があるように「シーケンス」戦略を選択すると思います(DBに挿入されていないレコードにはIDが割り当てられている可能性があります)。

Set<ResultAux> resultAuxes = result.getResultAuxes();
ResultAux  newResultAux = new ResultAux();

/**
 * As session.save()  requires to return the ID for the saved instance , if  "sequence" strategy is 
 * used , Hibernate will hit the DB  to select the next ID (eg. select some_seq.NEXTVAL) to be used 
 * for the saved instance. So newResultAux  will have an ID after save()  but actually it is not saved to 
 * the DB yet as  saving to the DB  occurs during session.flush()
 */
session.save(newResultAux);
resultAuxes.add(newResultAux);

解決策の1つは、 @Versionプロパティをに追加することResultAuxです。次に、このプロパティの値をチェックして、新しいレコードの@VersionプロパティがNULLである必要があるため、@Versionそれが新しいレコードであるかどうかを判断できます。

于 2012-05-07T08:34:15.260 に答える