невозможно перехватить org.hibernate.StaleObjectStateException при удалении записи, которой нет в базе данных - PullRequest
3 голосов
/ 25 ноября 2011

В моем приложении есть опция удаления пользователя. Теперь, чтобы проверить условие параллелизма, я попробовал следующий вариант использования

  1. открытое приложение в браузере Chrome и Firefox.
  2. удаленный пользователь в Firefox
  3. теперь пытаюсь удалить того же пользователя в браузере Chrome, я получаю исключение org.hibernate.StaleObjectStateException .. что правильно .. так как я пытаюсь удалить объект, который не существует Но я не могу поймать это исключение

try{
   getHibernateTemplate().delete(userObj);
} catch (StaleObjectStateException e) {
   e.printStackTrace();
}

Как мне поймать это исключение ??

Ответы [ 3 ]

6 голосов
/ 25 ноября 2011

Вы не сможете перехватить его там, потому что это не вызов delete, который выдает исключение, а сброс сеанса, который происходит позже (перед выполнением запроса или перед фиксацией транзакции).

Вы все равно не должны перехватывать это исключение, потому что, когда Hibernate генерирует исключение, вы больше не можете продолжать использовать сеанс: он находится в нестабильном состоянии.Единственная часть приложения, где такое исключение может быть перехвачено, находится за пределами транзакции, чтобы отобразить сообщение об ошибке для пользователя (или повторить попытку, но это не будет возможно в данном конкретном случае).

0 голосов
/ 25 ноября 2011

Код в вашем вопросе выглядит прямо на первый взгляд.

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

Я бы временно заменил бы уловс уловом java.lang.Throwable, чтобы увидеть, распространяется ли какое-то другое исключение в этой точке.И добавьте отпечаток трассировки, чтобы увидеть, выполняется ли код вообще.

Если у вас уже есть трассировка стека, она сообщит вам, где генерируется исключение, если не происходит что-то действительно сложное.Вам просто нужно поймать его дальше вверх по стеку.

0 голосов
/ 25 ноября 2011

Вы перехватываете StaleObjectStateException вместо StaleStateException: -)

UPDATE: посмотрите на трассировку стека;при условии, что вы работаете в транзакции, исключение может быть выдано только тогда, когда транзакция зафиксирована.

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