2013-05-26 4 views
1

Вот пример кода, я хочу, чтобы захватить исключение бросили на mybatis:Как захватить исключение mybatis «org.apache.ibatis.exceptions.PersistenceException»?

String resource = "com/sureone/server/db/mybatis-config.xml"; 
Reader reader = null; 
try { 
    reader = Resources.getResourceAsReader(resource); 
} catch (IOException e) { 
    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
} 
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); 
sqlSession = factory.openSession(true); 
tUserMapper = sqlSession.getMapper(TUserMapper.class); 

if(tUserMapper.insert(user)>0){  <===Exception throwed here for duplicate entry problem 
    return verifyLogin(user.getAccount(),user.getPassword()); 
} 
return null; 

Исключение я хочу захвачена:

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'userName' for key 'account_UNIQUE' 
+0

Вы также можете проверить полный ответ кода в [this] (http://stackoverflow.com/a/13602807/416369) SO thread. Однако в вашем случае, так как вы используете пакет «org.apache.ibatis ...», вам нужно будет поймать PersistenceException вместо NestedSQLException, поскольку это тот, который будет обертывать реальную причину. – sactiw

ответ

0

Вы можете захватить исключение Ibatis путем добавления попробовать/блокировки вокруг ваших операторов, которые вызывают myBatis query/insert. Например, если вы используете SqlSessionTemplate и метод SelectList(), вы можете сделать это:

 try { 
      myResults = mySqlSessionTemplate.selectList("getInfoList", parameterMap); 
     } catch (final org.apache.ibatis.exceptions.PersistenceException ex) { 
      logger.error("Problem accessing database"); 
      throw ex; 
     } 

ли вы вновь бросить исключение или потреблять и иметь дело с этим вот ваш выбор. Однако будьте осторожны с «едой» и не сталкивайтесь с этой проблемой, так как это позволит коду вызова прогрессировать, не зная о проблеме доступа к данным.

3

Вы можете захватить PersistenceException, как вы могли бы сделать, как правило:

try { 
    ... 
} catch (PersistenceException pe) { 

} 

Но не стоит забывать, что это Exception оборачивает реальное одно:

От MyBatis кода

} catch (Exception e) { 
    throw ExceptionFactory.wrapException("Error committing transaction. Cause: " + e, e); 
} 

Итак, если вы хотите получить право на причину PersistenceException, вам придется использовать .getCause() метод на PersistenceException

Имейте в виду, что MyBatis может также запустить свои собственные PersistenceException (TooManyResultException, BindingException ...) классы, те, которые не будут иметь причинуException завернуты.

+0

+1 для кода MyBatis, вы также можете включить пример для ловушки причины PersistanceException, например, вызвать: MySQLIntegrityConstraintViolationException – sactiw

Смежные вопросы