Entity Engine: GenericDuplicateKeyException

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3

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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Adrian Crum-2
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 <[hidden email]> wrote:

> From: Deyan Tsvetanov <[hidden email]>
> Subject: Entity Engine: GenericDuplicateKeyException
> To: [hidden email]
> 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3
Do you know a certain jdbc driver which does not support it ?

-- 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 <[hidden email]> wrote:
>
> > From: Deyan Tsvetanov <[hidden email]>
> > Subject: Entity Engine: GenericDuplicateKeyException
> > To: [hidden email]
> > 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3
In reply to this post by Adrian Crum-2
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 <[hidden email]> wrote:
>
> > From: Deyan Tsvetanov <[hidden email]>
> > Subject: Entity Engine: GenericDuplicateKeyException
> > To: [hidden email]
> > 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Adrian Crum-2
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 <[hidden email]> wrote:

> From: Deyan Tsvetanov <[hidden email]>
> Subject: Re: Entity Engine: GenericDuplicateKeyException
> To: [hidden email]
> 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 <[hidden email]>
> wrote:
> >
> > > From: Deyan Tsvetanov <[hidden email]>
> > > Subject: Entity Engine:
> GenericDuplicateKeyException
> > > To: [hidden email]
> > > 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3
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 <[hidden email]> wrote:
>
> > From: Deyan Tsvetanov <[hidden email]>
> > Subject: Re: Entity Engine: GenericDuplicateKeyException
> > To: [hidden email]
> > 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 <[hidden email]>
> > wrote:
> > >
> > > > From: Deyan Tsvetanov <[hidden email]>
> > > > Subject: Entity Engine:
> > GenericDuplicateKeyException
> > > > To: [hidden email]
> > > > 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Adrian Crum
Then create a Jira issue and attach a patch.

We might need to support both specs by having them specified in the
entitytengine datasource element.

-Adrian

On 7/19/2010 8:19 AM, Deyan Tsvetanov wrote:

> 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<[hidden email]>  wrote:
>>
>>> From: Deyan Tsvetanov<[hidden email]>
>>> Subject: Re: Entity Engine: GenericDuplicateKeyException
>>> To: [hidden email]
>>> 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<[hidden email]>
>>> wrote:
>>>>
>>>>> From: Deyan Tsvetanov<[hidden email]>
>>>>> Subject: Entity Engine:
>>> GenericDuplicateKeyException
>>>>> To: [hidden email]
>>>>> 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3
ok ,

thanks :)

On Mon, 2010-07-19 at 08:27 -0700, Adrian Crum wrote:

> Then create a Jira issue and attach a patch.
>
> We might need to support both specs by having them specified in the
> entitytengine datasource element.
>
> -Adrian
>
> On 7/19/2010 8:19 AM, Deyan Tsvetanov wrote:
> > 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<[hidden email]>  wrote:
> >>
> >>> From: Deyan Tsvetanov<[hidden email]>
> >>> Subject: Re: Entity Engine: GenericDuplicateKeyException
> >>> To: [hidden email]
> >>> 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<[hidden email]>
> >>> wrote:
> >>>>
> >>>>> From: Deyan Tsvetanov<[hidden email]>
> >>>>> Subject: Entity Engine:
> >>> GenericDuplicateKeyException
> >>>>> To: [hidden email]
> >>>>> 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 | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Scott Gray-2
In reply to this post by Adrian Crum-2
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 <[hidden email]> wrote:
>
>> From: Deyan Tsvetanov <[hidden email]>
>> Subject: Re: Entity Engine: GenericDuplicateKeyException
>> To: [hidden email]
>> 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 <[hidden email]>
>> wrote:
>>>
>>>> From: Deyan Tsvetanov <[hidden email]>
>>>> Subject: Entity Engine:
>> GenericDuplicateKeyException
>>>> To: [hidden email]
>>>> 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 (3K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Entity Engine: GenericDuplicateKeyException

Deyan Tsvetanov-3
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 <[hidden email]> wrote:
> >
> >> From: Deyan Tsvetanov <[hidden email]>
> >> Subject: Re: Entity Engine: GenericDuplicateKeyException
> >> To: [hidden email]
> >> 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 <[hidden email]>
> >> wrote:
> >>>
> >>>> From: Deyan Tsvetanov <[hidden email]>
> >>>> Subject: Entity Engine:
> >> GenericDuplicateKeyException
> >>>> To: [hidden email]
> >>>> 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
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>        
> >>
> >>
> >>
> >
> >
> >
>