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

Reply via email to