2013-09-15 4 views
3

Мое приложение использует JPA + JavaDB, и когда я пытаюсь сохранить объект, который нарушает ограничение, я получаю SQLIntegrityConstraintViolationException на консоли.Как поймать java.sql.SQLIntegrityConstraintViolationException?

Это нормально, но я не могу поймать это исключение, почему?


Это образец моего кода, в котором я хотел бы получить исключение. Если я посмотрю на documentation of persist(), нет никаких признаков SQLIntegrityConstraintViolationException.

em.getTransaction().begin(); 
em.persist(object); 
em.getTransaction().commit(); 

Часть следа консоли стека:

[EL Warning]: 2013-09-15 16:38:57.571--UnitOfWork(459929151)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: A instrução foi interrompida, porque iria gerar um valor duplicado da chave em uma restrição de chave primária ou de unicidade identificada por 'SQL130819202336721' definida em 'CORRETORA'. 
Error Code: -1 
Call: UPDATE CORRETORA SET NOME = ? WHERE (ID = ?) 
    bind => [2 parameters bound] 
Query: UpdateObjectQuery(Corretora[ id=7 ]) 
javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: A instrução foi interrompida, porque iria gerar um valor duplicado da chave em uma restrição de chave primária ou de unicidade identificada por 'SQL130819202336721' definida em 'CORRETORA'. 
Error Code: -1 
Call: UPDATE CORRETORA SET NOME = ? WHERE (ID = ?) 
    bind => [2 parameters bound] 
Query: UpdateObjectQuery(Corretora[ id=7 ]) 
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157) 
    at br.meuspila.util.AbstractCrud.persist(AbstractCrud.java:50) 
    at br.meuspila.corretora.CorretoraRN.persist(CorretoraRN.java:30) 
    at br.meuspila.javafx.EditarCorretoraController$1.handle(EditarCorretoraController.java:66) 
    at br.meuspila.javafx.EditarCorretoraController$1.handle(EditarCorretoraController.java:51) 
... 

ответ

2

Журнал говорит вам, почему. SQLIntegrityConstraintViolationException обернут внутри org.eclipse.persistence.exceptions.DatabaseException. Вы можете поймать это исключение и сделать что-то по поводу SQLIntegrityConstraintViolationException

Не зная ваш код, вы не можете сказать, где его изменить, но если вы действительно хотите поймать SQLIntegrityConstraintViolationException, вам придется сделать это, прежде чем он будет завернут в другое исключение.

+0

Спасибо, этот журнал меня смущает. – ceklock

+0

Теперь я увидел, что исходным исключением является javax.persistence.RollbackException (из em.getTransaction(). Commit()). Если я попытаюсь поймать SQLIntegrityConstraintViolationException или DatabaseException, я не имею успеха. Мое сообщение было отредактировано, чтобы добавить образец кода. – ceklock

+2

@ceklock Вы должны поймать тот, который обертывает других. Вы можете найти отладки. –

Смежные вопросы