Pergunta

Eu estou usando Hibernate JPA e Primavera no meu projeto. Suponha que se eu tentar inserir um registro com valor de chave duplicado, a consulta de inserção irá lançar uma exceção.

Agora, é possível obter o nome da tabela, nome do campo e possível causa para a exceção do objeto SQL exceção em tempo de execução!?

Foi útil?

Solução

Como as outras respostas já mencionado, na maioria das vezes você está limitado ao que você está dado pelo banco de dados. No entanto, em alguns casos Hibernate pode dizer-lhe o problema - não será a mesa e de campo, mas pode ser a entidade e propriedade

Por exemplo, se você tentar colocar o valor de uma muito grande em uma coluna você pode usar isto:

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());
    }
}

Outras dicas

SQLExceptions só tendem a envolver-se erros de banco de dados, você só pode obter esse tipo de informação se ele foi incluído no erro que seu banco de dados jogou. Na minha experiência de depuração de hibernação e outras coisas JDBC, eu arriscaria que a resposta a esta pergunta é geralmente "não", mas pode haver exceções.

O Hibernate envolve SQLException como JDBCException e tenta convertê-lo para mais significado exceção cheia como ConstraintViolationException usando SQLExceptionConverter que é anexado ao SessionFactory.

SQLException sqlException = ((JDBCException)ex).getSQLException(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top