Improve DaoException -------------------- Key: IBATIS-58 URL: http://issues.apache.org/jira/browse/IBATIS-58 Project: iBatis for Java Type: Improvement Versions: 2.0.9 Reporter: Siveton Vincent
Actually, in resume, SqlMapDaoTemplate throws a DaoException (a NestedRuntimeException subclass) if any SQLException is caught by insert, update or delete methods. The GeneralStatement class catch SQLException e and wrap it in a new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e); I think it is the DAO layer role to catch the sqlexception and give more information about this exception, like a schema integrity exception or a DB server exception. In the SqlMapDaoTemplate class, we can have for example: public Object insert / update / delete(String id, Object parameterObject) throws DaoException, DatabaseSchemaIntegrityException, DatabaseServerException; public Object execute* (String id, Object parameterObject) throws DaoException, DatabaseServerException; This idea is very easy to implement and improve (for me) the development: it s only parsing the sqlstate or the sqlerrorcode. What does the iBatis team think about that? Check these documentation: http://www.postgresql.org/docs/current/static/errcodes-appendix.html http://dev.mysql.com/doc/mysql/en/Error-handling.html For example, we can have this exception hierarchy: DatabaseSchemaIntegrityViolationException hierarchy can be |--ForeignKeyViolationException "23503".equals(se.getSQLState()) if postgresql 1216 == se.getErrorCode() if mysql |--NotNullViolationException "23502".equals(se.getSQLState()) if postgresql 1048 == se.getErrorCode() if mysql |--UniqueKeyViolationException "23505".equals(se.getSQLState()) if postgresql 1062 == se.getErrorCode() if mysql |--UniqueTableViolationException "42P07".equals(se.getSQLState()) if postgresql 1050 == se.getErrorCode() if mysql DatabaseServerException hierarchy is |--LostConnectionException "08003".equals(se.getSQLState()) if postgresql "08003".equals(se.getSQLState()) if mysql |--CommunicationFailureException "08S01".equals(se.getSQLState()) if postgresql 1043 OR 1053 OR 1081 OR 1154 == se.getErrorCode() if mysql -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira