0

Struts 1 アプリケーションにアクティビティ監査を追加しようとしています。オブジェクトを変更した後、変更されたオブジェクトを参照する行を監査テーブルに作成したいと考えています。参照先オブジェクトを変更したため、TransientObjectException が発生しています。セッションをフラッシュしようとしましたが、解決しませんでした。理由はわかりません。

merchant.setTrusted(false);
merchantDAO.saveOrUpdate(merchant);
// trying to resolve org.hibernate.PropertyValueException: not-null property references a null or transient value: com.rc.model.ActivityAudit.user
SessionManagerFactory.getSessionManager(DatasourceType.M).getSession().flush();

ActivityAuditManager.addActivityAudit("Set merchant to untrusted", merchant, userAccount);

ここで、ActivityAuditManager.addActivityAudit() は次のとおりです。

public static void addActivityAudit(String action, Merchant merchant, IMerchantUserAccount user) {
    ActivityAudit activityAudit = new ActivityAudit(merchant, action, user, new Date());
    activityAuditDAO.saveOrUpdate(activityAudit);
}

私が得ている例外は次のとおりです。

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

しかし、私が知る限り、私はそうです

ETA マッピング:

<class name="com.rc.model.ActivityAudit" table="activity_audit" discriminator-value="0">
...
    <many-to-one name="merchant" class="com.rc.model.Merchant"
                 column="merchantid" unique="false" not-null="true" cascade="none"/>
...

私は試しcascade="all"てみcascade="save-update"ましたが、どちらも状況を改善しませんでした。

ETA:以下の私自身の回答を参照してください。ただし、cascade="save-update"実際には修正されました。

4

1 に答える 1

0

2 つの問題がありました。最初の問題を修正したときに明らかになった 2 番目の問題は、最初はcascade="save-update"実際にこの問題を解決したという事実を覆い隠していました。

この質問では、 オブジェクトは保存されていない一時的なインスタンスを参照しています - ユーザーをフラッシュする前に一時的なインスタンスを保存してください。

そのデバッグ方法を使用して例外をより詳細に調べるまで、2 番目の問題に気付きませんでした。

于 2012-08-30T15:06:59.643 に答える