В настоящее время я работаю над проектом Java EJB, развертываемым в Weblogic 10.3.3. Мы используем JPA 1.0 с Hibernate 3.4 в качестве разработчика. Мы также используем Oracle10g Dialect.
Проблема, с которой мы сталкиваемся, связана с генерацией SQL в спящем режиме при попытке заблокировать строку для обновления.
Мы выполняем запрос:
Query q = entityManager.createNamedQuery("findMyObject");
MyHibernateObject myObject= (MyHibernateObject ) q.getSingleResult();
А затем заблокируйте этот объект с помощью:
entityManager.lock(myObject, LockModeType.WRITE);
Этот акт блокировки генерирует запрос:
SELECT myObject FROM myTable FOR UPDATE NOWAIT
Я хочу, чтобы он сгенерировал:
SELECT myObject FROM myTable FOR UPDATE
Разрешение другим потокам запрашивать этот объект без исключения: org.hibernate.exception.LockAcquisitionException и просто ждать своей очереди или позволить тайм-ауту транзакции EJB.
Итак, зная все это, могу ли я заставить Hibernate генерировать SQL без ключевого слова NOWAIT?
Я знаю, что использование Hibernate 3.6 и JPA 2.0 позволит это использовать пессимистичную блокировку, но из-за того, что Weblogic поддерживает только JPA 1.0, наши руки связаны.
В идеале я хочу избежать написания нашего собственного механизма повтора и / или тайм-аута, обрабатывая исключение, когда все, что мне нужно, это просто увеличить SQL, который генерирует Hibernate, когда EntityManager создает блокировку.