当发生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
答案 0 :(得分:2)
我认为这可能是一个安全问题。如果将sql语句添加到堆栈跟踪,则可能会将其发布给用户,因此请向他提供有关表名和列的信息。如果您的应用程序容易受到sql注入攻击,那么对于入侵者来说这将是一个非常大的好处。
答案 1 :(得分:0)
因为这不是它的实施方式。见HB-1055。
Spring和实现PersistenceExceptionTranslator
的类可能会提供更接近您期望的内容。