Почему org.hibernate.JDBCException не печатает инструкцию sql в трассировке стека - PullRequest
0 голосов
/ 28 июля 2010

Когда возникает org.hibernate.JDBCException (или подтип этого исключения), оператор sql не отображается в Stacktrace.

Например, если я выполняю следующий оператор SQL с помощью hibernate (в OracleБД, у которой нет таблицы или представления «nonexsiting»):

session.createSQLQuery("select * from nonexisting").list();

я получаю следующую трассировку стека:

org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    ...
Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: Table or view does not exist
    ...

Оператор SQL не отображается в трассировке стека, однакоОбъект исключения хранит информацию и может быть доступен по exception.getSQL().Было бы чрезвычайно ускорить отладку, если бы эта информация была также доступна в трассировке стека.

У кого-нибудь есть идея, почему эта информация недоступна в трассировке стека?Или как включить вывод этой информации в стековую трассировку?

Кстати, версия гибернации, которую я использовал для этого примера, - 3.3.1

Ответы [ 2 ]

2 голосов
/ 02 августа 2010

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

0 голосов
/ 29 июля 2010

Потому что это не так, как это было реализовано.См. HB-1055 .

Spring и классы, реализующие PersistenceExceptionTranslator, могут обеспечить что-то более близкое вашим ожиданиям.

...