Right, before that we had to use the sql state to check the type of the SQLException.
Still sql state has 2 specs - xopen and sql2003 identifying the type of the error. Entity Engine should support that level of abstraction and throw the DuplicateKeyException. I am willing to implement it because I actually need it :) -- deyan On Mon, 2010-07-19 at 06:46 -0700, Adrian Crum wrote: > PreparedStatement.execute throws SQLException: > > http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/sql/PreparedStatement.html#execute() > > If a database vendor chooses to add meaning to that exception by using a > subclass of SQLException, then they are welcome to do so - but they are not > *required* to do so. > > SQLIntegrityConstraintViolationException was added in Java 6. Any JDBC > drivers written before Java 6 will not use it. > > -Adrian > > --- On Mon, 7/19/10, Deyan Tsvetanov <[email protected]> wrote: > > > From: Deyan Tsvetanov <[email protected]> > > Subject: Re: Entity Engine: GenericDuplicateKeyException > > To: [email protected] > > Date: Monday, July 19, 2010, 6:22 AM > > The benefit here would be that > > developers will not have to invoke > > delegator.findOne() to check if a record with the same ID > > exists before > > trying create a new one. Saves one database call, > > postresql, mysql, > > oracle and mssql support it. If other databases or drivers > > do not than > > their drivers should not be labeled as JDBC compatible :) > > > > Anyway if the code bellow will catch the SQLException and > > re-throw > > GenericEntityException if the current DB driver is buggy > > and does not > > throw SQLIntegrityConstraintViolationException. > > > > -- Deyan > > > > On Mon, 2010-07-19 at 06:15 -0700, Adrian Crum wrote: > > > 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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
