我有一些对象,它的休眠 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 作为时间戳,并摆脱那个陈旧的对象状态异常。