Ottenere il nome del campo e della tabella che ha causato un'eccezione da un oggetto Eccezione SQL

StackOverflow https://stackoverflow.com/questions/829424

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!?

È stato utile?

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(); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top