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

有两个问题。第二个是在我修复第一个时发现的,最初掩盖了cascade="save-update"实际上确实解决了这个问题的事实。

在这个问题中, 对象引用了一个未保存的瞬态实例——在刷新之前保存瞬态实例 用户nanospeck发布了一个调试方法,对我有很大帮助。

直到我使用该调试方法并更详细地检查了异常时,我才注意到第二个问题。

于 2012-08-30T15:06:59.643 回答