2012-05-08 1 views
0

У меня есть метод внутри блока Try/Catch, который вызывает операцию сохранения Hibernate DB Save для вставки строки.Спящий режим не ускоряется, чтобы выхватить исключения базы данных

Метод завершается успешно, даже если есть проблемы с БД (например, когда я вставляю NULL в столбцы, отличные от NULL). Затем, в какой-то более поздний момент, Hibernates пытается «сбросить» или завершить транзакцию, и именно тогда возникают ошибки.

Это испортит поток моего кода, потому что я уверен, что мой метод успешно завершен, чтобы делать другие вещи, например. отправлять электронные письма. После вызова моего метода я продолжаю рассылать электронные письма на основе предположения о том, что ошибок не было (иначе меня бы выбросили из потока кода и в мой блок Catch, но это не).

Есть ли у кого-нибудь идеи, как справиться с этой ситуацией?

+0

Какое управление транзакциями/стратегией вы используете? Если вы ожидаете, что что-то будет сделано в БД, вы должны использовать явные транзакции. Никогда не стоит полагаться на неявные транзакции ... http://hibernateprofiler.com/learn/alerts/DoNotUseImplicitTransactions –

+0

Я не уверен, но есть ли способ автоматически скрыть сразу на уровне Hibernate? (Я не говорю о слое БД, это все еще транзакция.) –

+0

Почему вы не получаете исключение? Как исключение Hibernate или JDBC? –

ответ

3

Тривиальный ответ состоит в том, чтобы просто вызвать Session.flush(), и любой ожидающий SQL будет запущен, что вызовет любые исключения SQL, которые могут быть скрыты в то время.

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

+0

Да, это сработало. Благодарю. –

+1

Я бы отказался от использования явного вызова Session.flush(), необходимость в этом почти всегда указывает, что вы неправильно используете инфраструктуру Hibernate. Я согласен с вашей точкой зрения на то, что приложение проверяет вас. Это можно сделать, расширив файлы сопоставления hbm.xml, чтобы включить ограничения, которые вы добавили в свою БД. У этого есть бонусный (хороший) побочный эффект инструмента hbm2ddl, создающего схему ближе к реальности, если вы ее используете. –

+0

Итак, как мы знаем точно, когда спящий Спящий? Если я не использую flush(), как узнать, когда нужно проверять наличие ошибок? –

Смежные вопросы