首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate抛出Staleobjectstate异常,由上次修改时间戳导致在单个线程中访问

Hibernate抛出Staleobjectstate异常,由上次修改时间戳导致在单个线程中访问
EN

Stack Overflow用户
提问于 2013-09-23 17:19:26
回答 1查看 271关注 0票数 1

我有一些对象,带有hibernate xml (遗留系统):

代码语言:javascript
复制
<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中自己发出update语句。当显式调用hibernate的update方法时,它会抛出错误。

代码语言:javascript
复制
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

代码语言:javascript
复制
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。

目前,我已经在整个系统中将上次修改的时间戳更改为属性,并且错误消失了。

代码语言:javascript
复制
  <timestamp name="lastModifiedOn" column="last_modified_on" />

代码语言:javascript
复制
  <property type="timestamp" name="lastModifiedOn" column="last_modified_on" />

然而,现在db (datetime)中的字段last_modified_on不会自动更新到最新的时间,现在包含null,并且必须通过编程来完成,这是一个相当痛苦的更改,即使是在拦截的情况下。

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

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 19:34:43

您可以使用版本。

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

代码语言:javascript
复制
<version name="rowVersion" column="ROW_VERSION" type="java.lang.Long" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18955687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档