java - 如何捕获 java.sql.SQLIntegrityConstraintViolationException?

标签 java jpa javadb

我的应用程序使用 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,你必须在它被其他异常包裹之前这样做。

关于java - 如何捕获 java.sql.SQLIntegrityConstraintViolationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816761/

相关文章:

java - WCF\.Net\C# 中的 WSSE(带摘要)- 一种简单的方法?

java - 用于单写入器线程的 AtomicXXX 惰性设置

java - 如何使用查询而不是带有 JPA 的 @JoinColumn 映射实体关联?

hibernate - 无法使用 Spring JPA Vendor Adapter 使 hibernate 停止显示 SQL

JavaDB/ Derby 错误 08006

java - 从文件中执行 db 语句

java - Apache Derby 中找不到数据库错误

java - Maven 项目中缺少 servlet-api

java - 定期执行线程并在满足条件或时间结束后停止它

java - 不使用 SQL 从 JPA 中删除数据