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 <deyan_of...@flexbrix.com> wrote: > From: Deyan Tsvetanov <deyan_of...@flexbrix.com> > Subject: Re: Entity Engine: GenericDuplicateKeyException > To: user@ofbiz.apache.org > 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 <deyan_of...@flexbrix.com> > wrote: > > > > > From: Deyan Tsvetanov <deyan_of...@flexbrix.com> > > > Subject: Entity Engine: > GenericDuplicateKeyException > > > To: user@ofbiz.apache.org > > > 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 > > > > > > > > > > > > > > > > > > > > > > > > > > >