GWT RequestFactory Hibernate ненужный метод поиска вызова в локаторе - PullRequest
1 голос
/ 22 сентября 2011

Используя 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 и вызовам гибернации точно такой же запрос выбора, потому что он проверяет версию объекта.Таким образом, один выбор дублируется без необходимости, для каждого обновленного объекта !!!

1 Ответ

1 голос
/ 22 сентября 2011

RequestFactory отправляет только различия (т. Е. То, что вы изменили на объекте на стороне клиента), поэтому ему необходимо применить эти различия к объекту на стороне сервера, прежде чем вызывать ваш метод службы, и поэтому он долженнайти объект по его идентификатору.
Кроме того, когда вы ссылаетесь на объект, не изменяя его (например, вы устанавливаете объект свойства A для ссылки на объект B, объект B не изменяется), используется тот же метод find ();и в этом случае вам, вероятно, не нужна ошибка оптимистической блокировки (т. е. выполнить проверку оптимистической блокировки в find () невозможно).
С оптимистической блокировкой трудно справиться, потому что вам придется обрабатывать конфликты (и пользователи не хотят читать «кто-то изменил эту вещь, пока вы ее модифицировали, поэтому я собираюсь отбросить ваши изменения и начать все заново с самой новой версии»).

См. http://code.google.com/p/google-web-toolkit/issues/detail?id=6046 о оптимистичной блокировке и RequestFactory.

...