Ottenere il nome del campo e della tabella che ha causato un'eccezione da un oggetto Eccezione SQL
Domanda
Sto usando Hibernate JPA e Spring nel mio progetto. Supponiamo che se provo a inserire un record con un valore chiave duplicato, la query di inserimento genererà un'eccezione.
Ora, è possibile ottenere il nome della tabella, il nome del campo e la possibile causa dell'eccezione dall'oggetto Eccezione SQL in fase di esecuzione!?
Soluzione
Come menzionato nelle altre risposte, il più delle volte sei limitato a ciò che ti viene dato dal database. Tuttavia in alcuni casi Hibernate può dirti il ??problema: non sarà la tabella e il campo, ma può essere l'entità e la proprietà
Ad esempio, se si tenta di inserire un valore troppo grande in una colonna, è possibile utilizzare questo:
try {
entityManager.persist(object);
} catch (InvalidStateException e) {
log.info("Caught Hibernate exception: #0", e.getClass().getName());
InvalidValue[] invalidValues = e.getInvalidValues();
for(InvalidValue invalidValue : invalidValues) {
log.info("Invalid Property #0 has value: #1", invalidValue.getPropertyName(), invalidValue.getPropertyName());
}
}
Altri suggerimenti
Le SQLExceptions tendono solo a racimolare gli errori del database, è possibile ottenere quel tipo di informazioni solo se sono state incluse nell'errore generato dal database. Nella mia esperienza di debug di ibernazione e roba JDBC, rischierei che la risposta a questa domanda sia generalmente "no", ma potrebbero esserci delle eccezioni.
hibernate avvolge SQLException come JDBCException e cerca di convertirlo in un'eccezione più significativa come ConstraintViolationException utilizzando SQLExceptionConverter che è collegato a SessionFactory.
SQLException sqlException = ((JDBCException)ex).getSQLException();