Используя RequestFactory, я получаю данные в View, а затем в другой транзакции кто-то другой обновляет этот объект до версии 1 (My view по-прежнему имеет версию 0).Затем я обновляю некоторые значения и отправляю изменения по RequestFactory на уровень DAO.Проблема заключается в том, что измененный объект переносится на уровень обслуживания: локатор вызывает метод find и получает самую новую версию объекта (измененную кем-то другим).Поэтому, когда мы получим обновить метод в слое DAO, объект объединяется с версией 1 и изменяется из обеих транзакций!В этой ситуации в обычном случае Hibernate должен выдать исключение, потому что объект должен иметь другое значение версии (Optimistic Lock)?
Локатор:
@Component
public class TaskItemLocator extends Locator<TaskItem, Long> {
@Autowired
private TaskItemDao taskItemDao;
@Override
public TaskItem find(Class<? extends TaskItem> aClass, Long id) {
return taskItemDao.findTaskItem(id);
}
}
DAO:
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void updateTaskItems(List<TaskItem> taskItemToUpdate) {
for (TaskItem ti : taskItemToUpdate) {
getHibernateTemplate().update(ti);
}
}
Когда я моделирую эту ситуацию без вызова find в RequestFactory, все работает нормально.Исключение выдается, когда другая транзакция меняет мой объект.Но как получить это поведение в RequestFactory?Кроме того, перед каждым обновлением RequestFactory вызывается метод find, поэтому выполняется выбор в БД.Затем перейдите к уровню DAO и вызовам гибернации точно такой же запрос выбора, потому что он проверяет версию объекта.Таким образом, один выбор дублируется без необходимости, для каждого обновленного объекта !!!