powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Оптимистичная блокировка. Не знаю месть ли возможность сделать задуманное.
1 сообщений из 1, страница 1 из 1
Hibernate. Оптимистичная блокировка. Не знаю месть ли возможность сделать задуманное.
    #39434705
justcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, вопрос в следующем.
Предположим имеется сущности. Старны и города. Они связаны отношением один ко многим.

Допустим, оператор_1 забил в базу следующие данные:

Россия
______
1.Москва
2.СПб
3.Витебск

Украина
_______
1.Киев
2.Харьков

Беларусь
________
1.Минск
2.Гродно

Оператор 2 Решил посмотреть, какие города принадлежат странам.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 
TypedQuery<City> queryCities = em.createQuery("FROM City c where c.country.id = :id", City.class);
  for (Country country : countryList) {
   queryCities.setParameter("id", country.getId());
   List<City> cities = queryCities.getResultList();
   cities.forEach(System.out::println);
  //После первой итерации, т.е. после того как вывелись города России
 }



Итого, после первой итерации, вывелись города, которые принадлежат России: Мск, СПб, Витебск.

Оператор 2 обнаружил свою ошибку, и решил ее исправить, и закомитил изменения, сразу после первой итерации.
Он город Витебск назначил Беларуси.

В итоге, Оператор 1 увидет что один и тот же город принадлежит двум странам, что не есть хорошо.

Для того чтобы это пофиксить, ввел оптимистичную блокировку, добавил поле @Version В таблицу City. И подправил вызов:

Код: java
1.
2.
3.
4.
5.
6.
7.
 
TypedQuery<City> queryCities = em.createQuery("FROM City c where c.country.id = :id", City.class).setLockMode(LockModeType.OPTIMISTIC);
  for (Country country : countryList) {
   queryCities.setParameter("id", country.getId());
   List<City> cities = queryCities.getResultList();
   cities.forEach(System.out::println);
 }



В итоге ловлю ексепшн. Это устраивает, т.е. при чтении данных хочу получить неизменяемый срез ну или ексепшн если были изменения.

Так как я добавил поле @Version теперь, при редактировании City в случае одновременного редактирования я также получу ошибку. Но я не хочу ее там видеть, т.е. мне пофиг на редактирование. Пусть кто последний закомитит тот и прав. Я лишь хочу при чтении чтобы не было таких непоняток как с городом Витебском. Но хиб кидает исключения и при сохранении и при чтении данных в случае конкуррентного доступа.

Я думал что строки, а именно LockModeType.NONE

Код: java
1.
2.
3.
4.
transaction_begin
City city = em.find(City.class, 1L, LockModeType.NONE)
city.setName("new name");
transaction_end



не будут обращать внимания на оптимистичную блокировку, но все равно ловлю OptimisticLockException. Вопрос в том, можно ли как-то отключить проверку на версионость при записи данных, а при чтении учитывать? Что делает LockModeType.NONE тогда? Ну или в сторону чего посмотреть. Мне важно именно чтобы при чтении никаких фантом не появилось.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Оптимистичная блокировка. Не знаю месть ли возможность сделать задуманное.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]