Оптимистическая блокировка с помощью атрибута версии для объекта работает отлично и легко реализовать:Как использовать оптимистичное свойство блокировки Hibernate на передней панели?
<version property="VERSION" type="int" column="EX_VERSION" />
Объект имеет свойство следующего типа:
private int VERSION;
public int getVERSION() { return VERSION; }
public void setVERSION(int VERSION) { this.VERSION = VERSION; }
До сих пор, так хорошо. Теперь методы службы возвращают объект передачи данных (DTO) для объекта выше, который отображаются в HTML. Для страниц обновлений атрибут VERSION хранится в скрытом поле HTML и отправляется с формой.
Цель состоит в том, чтобы использовать свойство версии, чтобы убедиться, что обновление пользователя не удастся, если отображаемая информация сопровождается старой версией.
Контроллер отвечает на запрос обновления пользователей, вызывая метод службы с помощью DTO, содержащий обновленную информацию (включая свойство версии), а метод службы, в свою очередь, использует объект доступа к данным (DAO) для сохранения изменений:
public void update(SimpleDTO dto) {
SimplyEntity entity = getSimpleDao().load(dto.getId());
copyProperties(dto, entity); // all properties, including VERSION copied to entity
getSimpleDao().update(entity);
}
проблема заключается в том, что свойство версии копируется в сущности по copyProperties (...) не уважают Hibernate. Я проследил причину на следующем форуме: https://forum.hibernate.org/viewtopic.php?f=1&t=955893&p=2418068
Короче говоря, когда вызывается load(), Hibernate кэширует свойство версии в кеше сеанса, и не имеет значения, для чего впоследствии изменяется значение. Я согласен с тем, что это правильное поведение, но мне поручено Bosses передать версию через свойство HTML-формы (если для этого есть лучший образец, я бы хотел его услышать).
Одно из решений, которое я изучаю сейчас, заключается в выводе сущности из сеанса после того, как его версия была установлена с использованием hibernateTemplate.evict (simpleEntity) до того, как произойдет обновление. Я надеюсь, что это сработает, но это не кажется эффективным.
Я хотел бы попросить Hibernate проверить свойство версии на самом экземпляре, а не только на кеш сеанса.
Заранее благодарим за ответы!
- LES
evict() 'Сущность от сеанса работает. :) оставляя открытым, чтобы увидеть, есть ли у меня проницательные ответы ... – les2