Hallo allerseits
Während der Testphase habe ich eine ConstraintViolationException gezielt hervorgerufen: Ich versuche ein neues Objekt anzulegen, dessen Eigenschaft title einen schon vergebenen Wert bekommen soll. Diese Eigenschaft muss aber eindeutig (unique) sein. Der Versuch wird eben mit der ConstraintViaolationException quitteirt.
Mein Problem ist aber, dass ich im StackTrace nur sehe, dass ein Constraint verletzt wurde: keine weiteren Details sind zu sehen. Die Exception-Aufbau sieht wie folgt aus:
e (javax.persistence.RollbackException)
¦
-- cause (javax.persistence.PersistenceException)
In der Logdatei sieht der letzte StackTrace-Teil wie folgt aus:
[XML]
...
Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 insert into Room (seats, title, id) values (120, big_room, 54) wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2533)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1316)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:349)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2670)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
[/XML]
Wenn ich auf BatchUpdateException die Methode getNextException aufrufe, bekomme ich eine klare Erklärung, worin das Problem bestand! Nun frage ich mich aber, wie ich dies in die Logdatei bekomme! Denn, ich kann diese Methode erst auf der BatchUpdateException aufrufen, die wiederum in anderen Ausnahmen eingebettet ist. Und, wie tief sie eingebettet wurde, kann ich nicht zum Voraus sagen. Ergo müsste ich rekursiv nach diesem Ausnahme-Typ suchen und wenn ich es gefunden habe, die Methode "getNextException" aufrufen. Das würde aber den Code sehr belasten ...
Das Abfangen der Ausnahme und die Protokollierung habe ich zurzeit wie folgt gemacht:
Gibt es einen anderen Weg, um die "getNextException" aufzurufen und eine detailliertere Problembeschreibung in der Logdatei zu bekommen?
Danke.
Während der Testphase habe ich eine ConstraintViolationException gezielt hervorgerufen: Ich versuche ein neues Objekt anzulegen, dessen Eigenschaft title einen schon vergebenen Wert bekommen soll. Diese Eigenschaft muss aber eindeutig (unique) sein. Der Versuch wird eben mit der ConstraintViaolationException quitteirt.
Mein Problem ist aber, dass ich im StackTrace nur sehe, dass ein Constraint verletzt wurde: keine weiteren Details sind zu sehen. Die Exception-Aufbau sieht wie folgt aus:
e (javax.persistence.RollbackException)
¦
-- cause (javax.persistence.PersistenceException)
¦
-- cause (org.hibernate.exception.ConstraintViolationException)
¦
-- cause (java.sql.BatchUpdateException)
In der Logdatei sieht der letzte StackTrace-Teil wie folgt aus:
[XML]
...
Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 insert into Room (seats, title, id) values (120, big_room, 54) wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2533)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1316)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:349)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2670)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
[/XML]
Wenn ich auf BatchUpdateException die Methode getNextException aufrufe, bekomme ich eine klare Erklärung, worin das Problem bestand! Nun frage ich mich aber, wie ich dies in die Logdatei bekomme! Denn, ich kann diese Methode erst auf der BatchUpdateException aufrufen, die wiederum in anderen Ausnahmen eingebettet ist. Und, wie tief sie eingebettet wurde, kann ich nicht zum Voraus sagen. Ergo müsste ich rekursiv nach diesem Ausnahme-Typ suchen und wenn ich es gefunden habe, die Methode "getNextException" aufrufen. Das würde aber den Code sehr belasten ...
Das Abfangen der Ausnahme und die Protokollierung habe ich zurzeit wie folgt gemacht:
Java:
catch (Exception e) {
logger.error("Error during creation: ", e);
// ...
throw new RuntimeException(e);
}
Gibt es einen anderen Weg, um die "getNextException" aufzurufen und eine detailliertere Problembeschreibung in der Logdatei zu bekommen?
Danke.