При каких обстоятельствах сеанс Hibernate действительно становится непригодным для использования после возникновения исключения Hibernate?
Интересный вопрос. Я почти уверен, что видел случаи, когда сессия все еще «работала» после такого исключения. Возможно, проблема в том, что это не гарантировано. Мне нужно копать это немного больше.
Обновление: Цитата это сообщение от разработчика Hibernate на форумах Hibernate:
Сеанс гибернации следует выбрасывать при возникновении любого исключения. Его можно оставить в несогласованном состоянии относительно базы данных. Это не относится к сеансу только для чтения, поскольку он не использует кэширование на уровне сеанса. В качестве альтернативы, вы можете очистить кэш уровня сеанса при возникновении исключения (но лично мне не нравится этот подход, поскольку он не является чистым решением и может привести к будущим проблемам и проблемам).
Таким образом, проблема не в том, действительно ли Session
"технически пригоден" или нет, проблема в том, что он может вести себя не так, как ожидалось. И вы явно этого не хотите.
Как воспроизвести это в тесте?
Вы можете сознательно нарушить условие, вызывающее выброс подкласса, например, нарушив ограничение целостности, чтобы получить ConstraintViolationException
. Как насчет чего-то такого:
Session session = HibernateUtil.getCurrentSession();
try {
session.beginTransaction();
// execute some code that violates a unique constraint
...
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
}
// keep using the session
try {
session.beginTransaction();
...
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
}
// do we reach this point?
Но я не уверен, что это что-нибудь докажет. Я имею в виду, если сессия все еще работает, мы можем завершить только для этого конкретного случая.
Обновление: Забудьте мое предложение, оно ничего не докажет. И на самом деле, я думаю, что было бы чрезвычайно сложно (технически и функционально) доказать, что все работает как ожидалось (и это все еще может быть "несчастным случаем") после HibernateException
.
Таким образом, вместо того, чтобы пытаться что-то доказать, я думаю, что правильнее всего следовать рекомендациям (или предложенной альтернативе, но я бы просто запросил новые Session
и close
для каждой транзакции, сгенерированной исключительной ситуации или нет ).
Какой термин подходит для такого теста?
Интеграционный тест? Испытание на прочность?