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 <[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 >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >> >> >> > > >
smime.p7s
Description: S/MIME cryptographic signature
