https://issues.apache.org/jira/browse/OFBIZ-3870
On Tue, 2010-07-20 at 09:06 +1200, Scott Gray wrote: > Also worth noting is that a SQLIntegrityConstraintViolationException is not > necessarily indicative of a duplicate primary key error, it could be also be > a foreign or unique key violation. > > Regards > Scott > > HotWax Media > http://www.hotwaxmedia.com > > On 20/07/2010, at 1:46 AM, 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 <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 > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>> > >>> > >>> > >> > >> > >> > > > > > > >