2

Emailオブジェクトがあります。

email.hbmには

<bag name="emailRecipients" lazy="false" inverse="false"
             cascade="save-update" fetch="select">
            <key column="EMAIL_ID" />           
            <one-to-many class="EmailRecipient" />  
</bag>          
<bag name="emailStateRecipients" lazy="false" inverse="false"
             cascade="save-update" fetch="select">
            <key column="EMAIL_ID" />           
            <one-to-many class="EmailStateRecipient" /> 
</bag> 

EmailRecipientおよびEmailStateRecipientオブジェクトの配列リストを持つ新しい電子メールを保存しようとしています。

私が試したとき:

this.getHibernateTemplate().saveOrUpdate(email);

エラーが発生しました:

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.abc.model.EmailRecipient#0]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.abc.model.EmailRecipient#0]

だから私はに変更しました:

this.getHibernateTemplate().merge(email);

ここで、このエラーが発生します。

org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: No row with the given identifier exists: [com.abc.model.EmailRecipient#0]; nested exception is org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.abc.model.EmailRecipient#0]

誰かがこれを解決するのを手伝ってもらえますか?オブジェクトがすでに存在するかどうかを確認する必要があると思います。存在する場合は、マージするか、保存します。しかし、方法はわかりません。また、hbmが正しい場合は?

ありがとう

編集:

EmailRecipient.hbm

<hibernate-mapping package="com.abc.model">
    <class name="EmailRecipient" table="EMAIL_RCPNT">
        <id name="emailRecipientId" column="EMAIL_RCPNT_ID" type="long">
            <generator class="sequence">
                <param name="sequence">SEQ_RCPNT_ID_PK</param>
            </generator>            
        </id>
        <property name="roleId" column="ROLE_ID" type="long" />     
    </class>
</hibernate-mapping>

email.hbmでOneToManyとして宣言されているため、emailIdプロパティをRecipient.hbmに追加していません。

もう1つの奇妙な側面は、これ(saveOrUpdate)は単体テストでは正常に機能しますが、アプリから実行する場合は機能しません。

4

1 に答える 1

0

わお!ついに問題を解決しました。

EmailRecipientIdは「Long」として宣言され、プリミティブ型に変更すると問題が解決しました。

それをチェックするように頼んでくれた@Jeroenに感謝します

于 2012-07-25T18:09:30.387 に答える