jpa2 hibernate, тестовый сценарий для проверки блокировки объекта - PullRequest
1 голос
/ 10 сентября 2010

Я использую Hibernate 3.5.5.Final и JPA2

Как создать тестовый сценарий для проверки работоспособности блокировки гибернации?

Я написал это, но кажется, что тест не проходит в текущей версии Hibernate (работает хорошо в предыдущей версии)

@Test(expected=OptimisticLockException.class)
public void testLock() {
    EntityManager em = getEntityManager();
    Foo foo1 = fooDAO.findById(1);
    em.lock(foo1, LockModeType.WRITE);
    foo1.setCode("code3");
    em.flush();
}

EDIT:

@ Паскаль: это то, что вы имеете в виду во втором случае?

@Test(expected=OptimisticLockException.class)
public void testLock() {
   EntityManager em = getEntityManager();
   em.getTransaction().begin();
   Foo foo1 = fooDAO.findById(1);
   em.lock(foo1, LockModeType.WRITE);
   fooDAO.createHibernateQuery("update Foo set version=version+1 where id = 1");
   foo1.setCode("code3");
   em.flush();
}

Спасибо

1 Ответ

2 голосов
/ 10 сентября 2010

Я не вижу одновременного доступа в этом тесте, нет никаких причин, по которым он не работает IMO. Если вы хотите проверить поведение оптимистической блокировки с обновлением версии , вам нужно протестировать что-то вроде этого:

  • Чтение Foo с Id = X в персистентном контексте 1 (версия N)
  • Чтение Foo с идентификатором = X в персистентном контексте 2 (версия N)
  • Внести изменения в экземпляр foo на ПК 1
  • Внести изменения в экземпляр foo на ПК 2
  • Сбросить и зафиксировать изменения в ПК 1 // должно быть в порядке (версия становится N + 1)
  • Сбросить изменения в ПК 2 // должно выдать исключение

Использование одного контекста персистентности и SQL-запроса - это еще один вариант:

  • Чтение Foo с Id = X в постоянном контексте 1 (версия N)
  • Внести некоторые изменения в экземпляр foo на ПК 1
  • Используйте SQL для ОБНОВЛЕНИЯ Foo set version = version + 1 WHERE id = X
  • Сбросить изменения в ПК 1 // должно выдать исключение

Смотри также

...