Java 如何在SPRING中捕获Hibernate SQL异常

Java 如何在SPRING中捕获Hibernate SQL异常,java,sql-server,spring,hibernate,Java,Sql Server,Spring,Hibernate,我使用hibernate在spring中执行sql语句,但为了处理异常,我使用了hibernate异常和sql异常,但我无法处理异常 如果我的sql server未打开或不可访问,我将无法捕获异常,我将收到错误消息 org.hibernate.exception.JDBCConnectionException 此处name.save(用户) 是执行sql命令的hibernate命令 如何捕获这种类型的异常 我犯了错误 JDBCConnectionException的捕获块不可访问。此异常从不

我使用hibernate在spring中执行sql语句,但为了处理异常,我使用了hibernate异常和sql异常,但我无法处理异常

如果我的sql server未打开或不可访问,我将无法捕获异常,我将收到错误消息

org.hibernate.exception.JDBCConnectionException 
此处
name.save(用户)

是执行sql命令的hibernate命令

如何捕获这种类型的异常

我犯了错误

JDBCConnectionException的捕获块不可访问。此异常从不从try语句体引发

SQLException的不可访问捕获块。决不会从try语句体引发此异常

霉菌代码:

try
{
      ApplicationContext appContext = 
              new ClassPathXmlApplicationContext("/config/BeansInfo.xml");
    TokenBo tokenBo = (TokenBo)appContext.getBean("TokenBo");
    TokenModel token = new TokenModel();
    token.setNumber(Number);
    token.setID(ID);
}

catch(JDBCConnectionException ex  )
{
  System.out.println(ex);
}
catch(SQLException e){}

您只能捕获直接向您抛出的异常(至少对于选中的异常…)。如果您真的希望以任何合理的方式处理这个特定的错误情况,那么就有可能捕获抛出给您的内容,并检查所提供异常的原因

try {
    // some hibernate calls
} catch (GenericJdbcException ge) {
    if(ge.getCause() != null && ge.getCause() instanceof SQLException) {
        SQLException se = (SQLException)ge.getCause();
        if(se.getErrorCode() == -911) {
            // your error handling for this case
        }else{
            throw ge; // do not swallow unhandled exceptions
        }
    }else{
        throw ge // do not swallow unhandled exceptions
    }
}

Credit

对于连接相关的异常使用JDBCConnectionException,对于约束冲突使用ConstraintViolationException。您应该根据自己的要求使用其他例外情况。除@Tanjim Rahman外,请参见

代码片段

在UserDAOImpl.java中

使用ConstraintViolationException捕获重复条目

@Override
public String addUser(User user) 
{
    Session openSession = sessionFactory.openSession();
    String retStr = null;

    try
    {
        openSession.getTransaction().begin();
        openSession.persist(user);
        openSession.getTransaction().commit();

        retStr = "success";
    }
    catch (ConstraintViolationException e)
    {
        openSession.getTransaction().rollback();

        String[] tmpArr =  e.getSQLException().toString().split(":");
        String[] anotherTmpArr = null;

        if( tmpArr.length > 1)
        {
            anotherTmpArr = tmpArr[1].split("for key");
        }

        retStr = anotherTmpArr[0];

    }
    catch (HibernateException e) 
    {
        retStr = e.getLocalizedMessage();
    }

    finally 
    {
        openSession.close();
    }


    return retStr;
}

我还想捕获sql不可执行异常,如主键冲突如何捕获该异常@Labeo的可能重复项从不将附加信息放入注释中;始终更新您的问题-不要期望其他人阅读(可能很长的)评论列表。我无法获得GenericJdbcException,因为它正在请求创建一个ittry类,它正在为JDBCConnectionException提供无法访问的捕获块。此异常从不从JDBCConnectionException的try语句体-不可访问的catch块抛出。这个异常永远不会从try语句bodyUse multiple catch块而不是使用OR抛出。我仍然面临同样的问题。请您提供示例代码,因为我也在使用Spring MVC+Hibernate。这对我来说很好。实际上,当您使用SpringMVC时,我建议您使用AOP的GlobalExceptionHandler来处理异常。那会好得多。