Hibernate: выберите для обновления в два запроса - PullRequest
0 голосов
/ 04 мая 2018

В моем проекте springBoot я использую hibernate для получения lock в своей базе данных Oracle.

В моей транзакции я выполняю следующий код:

Query q = em.createQuery("SELECT m FROM myTablem WHERE foo= :cat");
q.setParameter("cat", myValue);
q.setMaxResults(1);

//use pessimistic lock
//With Oracle, the select is a 'select for update' request
q.setLockMode(LockModeType.PESSIMISTIC_WRITE);

//set hibernate timeout to 0
//With Oracle, the 'select for update' is transformed in 'select for update nowait'
q.setHint("javax.persistence.lock.timeout", 0);

List<Msisdn> msisdns = q.getResultList();

Я хочу выполнить "select for update" в моей базе данных. Но с этим кодом hibernate выполняет два запроса:

Hibernate : выберите * из (выберите m ..... из myTablem m кросс-объединение

Hibernate : выберите ce_code_abpq из m, где idpk1 =? и idpk2 =? и idpk3 =? для обновления nowait

В первом запросе hibernate выполняет запрос select. И во втором запросе hibernates вызывает "select for update" для выбранного элемента.

Можно ли выполнить "select for update" только в одном запросе?

С уважением Седрик

1 Ответ

0 голосов
/ 04 мая 2018

Чтобы отключить последующую блокировку:

  1. Обновление до Hibernate 5.2.1
  2. Либо обновите базу данных до 12c и используйте Oracle12cDialect, либо установите подсказку запроса HINT_FOLLOW_ON_LOCKING на false

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...