У меня есть некоторые объекты, с его спящим 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 как временную метку, и избавиться от этого исключения состояния устаревшего объекта.
Я не уверен, что вы имеете в виду. я должен добавить другую версию столбца во всех объектах и таблицах, чтобы сохранить номер версии, а затем обновить все места, где объект обновлен, чтобы добавить эту проверку? – Saky