Java 如何在SPRING中捕获Hibernate SQL异常
我使用hibernate在spring中执行sql语句,但为了处理异常,我使用了hibernate异常和sql异常,但我无法处理异常 如果我的sql server未打开或不可访问,我将无法捕获异常,我将收到错误消息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的捕获块不可访问。此异常从不
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来处理异常。那会好得多。