2013-09-23 3 views
0

У меня есть некоторые объекты, с его спящим XML (традиционная система):Hibernate метание Staleobjectstate исключения доступно в одном потоке, вызванном Последним изменение метки времени

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

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

в сервлет добавлены объекты и обновлении и т.д. Используя postgresql, сервлеты работают, и исключение не генерируется. Использование MSSQL, когда только один пользователь обращается к сервлету, исключение staleobjectstate в том, что строка была обновлена ​​или удалена другой транзакцией.

Hibernate SQL показал, что он сам выпускает операторы обновления в сервлет. Когда вызывается явный метод обновления hibernate, он выдает ошибку.

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? Только поле ID - это PK в db. Доступ к сервлету осуществляется только одним пользователем.

На данный момент я изменил последнее изменение с отметки времени до свойства, по всей системе, и ошибка исчезла. также sql, сгенерированный спящим режимом, теперь проверяет только на основе идентификатора.

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

в

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

Однако теперь поле last_modified_on в БД (DateTime) не получите автоматически обновляться с последнего времени, содержит нуль сейчас, и должны сделать это программно, который является довольно боль, чтобы сделать это изменение, даже с перехватом.

Есть ли способ, которым я все еще могу использовать lastModifiedOn как временную метку, и избавиться от этого исключения состояния устаревшего объекта.

ответ

0

Вы можете использовать версию.

В DAO вы можете проверить rowversion перед обновлением.

<version name="rowVersion" column="ROW_VERSION" type="java.lang.Long" /> 
+0

Я не уверен, что вы имеете в виду. я должен добавить другую версию столбца во всех объектах и ​​таблицах, чтобы сохранить номер версии, а затем обновить все места, где объект обновлен, чтобы добавить эту проверку? – Saky

 Смежные вопросы

  • Нет связанных вопросов^_^