0

org.hibernate.JDBCExceptionが発生した場合(またはこの例外のサブタイプ)、sqlステートメントはStacktraceに表示されません。

たとえば、次のSQLステートメントを休止状態で実行した場合(テーブルまたはビュー'nonexsiting'がないOracleDBで):

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()。この情報がスタックトレースでも利用できる場合は、デバッグが非常に高速になります。

この情報がスタックトレースで利用できない理由を誰かが知っていますか?または、スタックトレースでこの情報の出力を有効にする方法は?

ちなみに、この例で使用したHibernateバージョンは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 に答える