1

我有一些对象,它的休眠 xml(旧系统):

<id name="id" type="java.lang.Long">
   <column name="id" />
   <generator class="increment" />
 </id>

  <timestamp name="lastModifiedOn" column="last_modified_on" />
  ...

在 servlet 中,对象被添加和更新等。使用 postgresql servlet 工作并且没有抛出异常。使用 MSSQL,当只有一个用户访问 servlet 时,会抛出 staleobjectstate 异常,表明该行已被另一个事务更新或删除。

Hibernate SQL 表明它在 servlet 中自己发出更新语句。当显式调用 hibernate 的 update 方法时,它会抛出错误。

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

奇怪的是更新对象的sql是:

update
    equipment 
set
    last_modified_on=?,
    created_on=?,
    public_id=?,
    vendor_id=?,
    created_by=?,
    last_modified_by=?,
    equipment_id=? 
where
    ID=?
    and last_modified_on=?

它的检查基于 ID 并最后修改?为什么不只是身份证?数据库中只有 ID 字段是 PK。只有一个用户正在访问 servlet。

目前我已经在整个系统中将上次修改时间从时间戳更改为属性,并且错误消失了。hibernate 生成的 sql 现在也只基于 ID 进行检查。

  <timestamp name="lastModifiedOn" column="last_modified_on" />

  <property type="timestamp" name="lastModifiedOn" column="last_modified_on" />

但是,现在 db (datetime) 中的字段 last_modified_on 不会自动更新为最新时间,现在包含 null,并且必须以编程方式进行此更改,即使进行拦截也是相当痛苦的。

有什么方法可以让我仍然使用 lastModifiedOn 作为时间戳,并摆脱那个陈旧的对象状态异常。

4

1 回答 1

0

您可以使用版本。

在 DAO 中,您可以在更新前检查 rowversion。

<version name="rowVersion" column="ROW_VERSION" type="java.lang.Long" />
于 2013-09-23T11:34:42.683 回答