I agree that better mapping of SQL exception causes would be helpful in 
debugging and it could help in certain algorithms. For example, testing for a 
primary key violation could be used as an alternate way to get the next invoice 
number.

The problem with using SQLIntegrityConstraintViolationException is that not all 
JDBC drivers will support it, so it might not get caught.

-Adrian

--- On Mon, 7/19/10, Deyan Tsvetanov <[email protected]> wrote:

> From: Deyan Tsvetanov <[email protected]>
> Subject: Entity Engine: GenericDuplicateKeyException
> To: [email protected]
> Date: Monday, July 19, 2010, 5:43 AM
> 
> Hi guys, 
> 
> there is a problem in entity engine which I would like to
> fix. 
> 
> Reproduction:
> 
> I am trying to create a party with a duplicate partyId. 
> 
> In general I thought I have to expect a
> GenericDuplicateKeyException. 
> 
> However the exception that I get is a regular
> GenericEntityException
> with a nested GenericDateSourceException one with nested
> PSQLException
> inside. The exception  message is: ERROR: duplicate
> key value violates
> unique constraint "pk_party"
> 
> I believe it should be expected that a
> GenericDuplicateKeyException will be thrown in case of a
> duplicate
> primary key.
> 
> 
> 
> The solution for that would be to handle not only
> SQLException in org.ofbiz.entity.jdbc.SQLProcessor 
> but it's subclasses as well and throw the corresponding
> entity engine exceptions. 
> 
> So the code: 
> 
> } catch (SQLException sqle) {
>            throw new
> GenericDataSourceException("SQL Exception while executing
> the following:" + sql, sqle);
> }
> 
> would be changed to :
> 
> 
> } catch ( SQLIntegrityConstraintViolationException icvEx )
> {
>    throw new GenericDuplicateKeyException(
> "Duplicate key exception while executing the following: " +
> sql , icvEx );
> } catch (SQLException sqle) {
>            throw new
> GenericDataSourceException("SQL Exception while executing
> the following:" + sql, sqle);
> } 
> 
> on all occurances of catching a SQLException where insert
> or update is executed. 
> 
> -- deyan 
> 
> 
> 
> 
> 
> 



Reply via email to