捕获“ORA-00001: 违反唯一约束条件”异常并抛出业务相关的错误信息

http://my.oschina.net/u/213148/blog/180202


1.背景:T表F字段唯一索引,保存F字段重复的数据后台异常(附后),不做处理MVC框架包装异常后,前台显示"Could not execute JDBC batch update; nested exception is org.hibernate.exception…“,报错信息不友好,故主动捕获后跑出友好业务相关信息"XXXXXXXXXX重复”。

2.框架:Hibernate+Spring+公司MVC。

3.异常详情:

Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:636)
        at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
        at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
        at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:890)
        ......
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
        at org.springframework.orm.hibernate3.HibernateTemplate$28.doInHibernate(HibernateTemplate.java:892)
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
        ... 60 more
Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (IDX_T_A)

        at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:566)
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9365)
        at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
        at weblogic.jdbc.wrapper.PreparedStatement.executeBatch(PreparedStatement.java:191)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
        ... 67 more

4.解决过程:

so easy…直接捕获呗,从异常信息里找唯一约束索引号,如果找到不ok了嘛,代码见下:

try {
    busiDAO.save(bean);
} catch(RuntimeException e) {
    String errMsg = e.getMessage();
    if(StringUtils.isNotBlank(errMsg) && errMsg.indexOf("IDX_T_A")!=-1) {
        throw new RuntimeException("XXXXXXXXXX重复!");
    }
    throw e;
}

no…no…捕获不了呀,系统仍然抛底层的错误信息。

oh!e.getMessage()得到的是"Could not execute JDBC batch update; nested exception is org.hibernate.exception”,获取不到唯一约束索引号,这什么状况啊?

oh!错误信息在里面了,好吧,再往里一步,代码如下:

try {
    busiDAO.save(bean);
} catch(RuntimeException e) {
    Throwable cause = e.getCause();
    if(cause instanceof org.hibernate.exception.ConstraintViolationException) {
        String errMsg = ((org.hibernate.exception.ConstraintViolationException)cause).getSQLException().getMessage();
        if(StringUtils.isNotBlank(errMsg) && errMsg.indexOf("IDX_T_A")!=-1) {
            throw new RuntimeException("XXXXXXXXXX重复!");
        }
    }
    throw e;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值