为什么org.hibernate.JDBCException不在stacktrace中打印sql语句

时间:2010-07-28 11:31:18

标签: hibernate exception ora-00942

当发生org.hibernate.JDBCException(或此Exception的Subtype)时,在Stacktrace中看不到sql语句。

例如,如果我使用hibernate执行以下SQL语句(在没有表或视图'不存在'的Oracle DB上):

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

我得到以下stacktrace:

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对象已存储信息,可由exception.getSQL()访问。如果这些信息在堆栈跟踪中也可用,它将极大地加快调试速度。

任何人都知道为什么这些信息在stacktrace中不可用?或者如何在stacktrace中启用此信息的输出?

顺便说一句,我在本例中使用的hibernate版本是3.3.1

2 个答案:

答案 0 :(得分:2)

我认为这可能是一个安全问题。如果将sql语句添加到堆栈跟踪,则可能会将其发布给用户,因此请向他提供有关表名和列的信息。如果您的应用程序容易受到sql注入攻击,那么对于入侵者来说这将是一个非常大的好处。

答案 1 :(得分:0)

因为这不是它的实施方式。见HB-1055

Spring和实现PersistenceExceptionTranslator的类可能会提供更接近您期望的内容。