Return-Path: Delivered-To: apmail-ofbiz-user-archive@www.apache.org Received: (qmail 278 invoked from network); 19 Jul 2010 15:44:35 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 19 Jul 2010 15:44:35 -0000 Received: (qmail 3315 invoked by uid 500); 19 Jul 2010 15:44:34 -0000 Delivered-To: apmail-ofbiz-user-archive@ofbiz.apache.org Received: (qmail 3302 invoked by uid 500); 19 Jul 2010 15:44:34 -0000 Mailing-List: contact user-help@ofbiz.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@ofbiz.apache.org Delivered-To: mailing list user@ofbiz.apache.org Received: (qmail 3294 invoked by uid 99); 19 Jul 2010 15:44:34 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 19 Jul 2010 15:44:34 +0000 X-ASF-Spam-Status: No, hits=0.7 required=10.0 tests=SPF_NEUTRAL,T_FRT_BELOW2 X-Spam-Check-By: apache.org Received-SPF: neutral (nike.apache.org: local policy) Received: from [209.85.161.44] (HELO mail-fx0-f44.google.com) (209.85.161.44) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 19 Jul 2010 15:44:27 +0000 Received: by fxm1 with SMTP id 1so2509179fxm.31 for ; Mon, 19 Jul 2010 08:43:06 -0700 (PDT) Received: by 10.223.116.6 with SMTP id k6mr3968069faq.49.1279554186796; Mon, 19 Jul 2010 08:43:06 -0700 (PDT) Received: from [192.168.1.130] ([78.142.51.15]) by mx.google.com with ESMTPS id h8sm2062309faj.14.2010.07.19.08.43.06 (version=SSLv3 cipher=RC4-MD5); Mon, 19 Jul 2010 08:43:06 -0700 (PDT) Subject: Re: Entity Engine: GenericDuplicateKeyException From: Deyan Tsvetanov To: user@ofbiz.apache.org In-Reply-To: <4C446EC7.6020008@hlmksw.com> References: <720244.46769.qm@web63102.mail.re1.yahoo.com> <1279552783.1958.87.camel@ghost-laptop> <4C446EC7.6020008@hlmksw.com> Content-Type: text/plain; charset="UTF-8" Date: Mon, 19 Jul 2010 18:43:02 +0300 Message-ID: <1279554182.1958.92.camel@ghost-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org 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 wrote: > >> > >>> From: Deyan Tsvetanov > >>> 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 > >>> wrote: > >>>> > >>>>> From: Deyan Tsvetanov > >>>>> 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 > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>> > >>>> > >>>> > >>> > >>> > >>> > >> > >> > >> > > > > > >