数据库
首页 > 数据库> > 如何捕获java.sql.SQLIntegrityConstraintViolationException?

如何捕获java.sql.SQLIntegrityConstraintViolationException?

作者:互联网

我的应用程序使用JPA JavaDB,当我尝试持久存储违反约束的对象时,控制台上显示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)
...

解决方法:

日志告诉您原因. SQLIntegrityConstraintViolationException包装在org.eclipse.persistence.exceptions.DatabaseException内部.您可以捕获此异常并对SQLIntegrityConstraintViolationException做一些处理

不知道您的代码,不可能告诉您在哪里进行更改,但是如果您想真正捕获SQLIntegrityConstraintViolationException,则必须在将其包装到另一个异常中之前执行此操作.

标签:jpa,javadb,java
来源: https://codeday.me/bug/20191122/2062304.html