0

当 org.hibernate.JDBCException 发生(或此异常的子类型)时,sql 语句在 Stacktrace 中不可见。

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

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 对象存储了信息并且可以通过exception.getSQL(). 如果堆栈跟踪中也提供此信息,它将极大地加快调试速度。

有人知道为什么堆栈跟踪中没有这些信息吗?或者如何在堆栈跟踪中启用此信息的输出?

顺便说一下,我在这个例子中使用的休眠版本是 3.3.1

4

2 回答 2

2

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

于 2010-08-02T08:53:17.837 回答
0

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

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

于 2010-07-28T22:54:55.170 回答