| From | Sent On | Attachments |
|---|---|---|
| Deyan Tsvetanov | Jul 19, 2010 5:43 am | |
| Deyan Tsvetanov | Jul 19, 2010 6:10 am | |
| Adrian Crum | Jul 19, 2010 6:15 am | |
| Deyan Tsvetanov | Jul 19, 2010 6:18 am | |
| Deyan Tsvetanov | Jul 19, 2010 6:22 am | |
| Adrian Crum | Jul 19, 2010 6:45 am | |
| Deyan Tsvetanov | Jul 19, 2010 8:19 am | |
| Adrian Crum | Jul 19, 2010 8:26 am | |
| Deyan Tsvetanov | Jul 19, 2010 8:42 am | |
| Scott Gray | Jul 19, 2010 2:06 pm | |
| Deyan Tsvetanov | Jul 22, 2010 12:32 am |
| Subject: | Re: Entity Engine: GenericDuplicateKeyException | |
|---|---|---|
| From: | Adrian Crum (adri...@hlmksw.com) | |
| Date: | Jul 19, 2010 8:26:40 am | |
| List: | org.apache.ofbiz.user | |
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:
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<deya...@flexbrix.com> wrote:
From: Deyan Tsvetanov<deya...@flexbrix.com> Subject: Re: Entity Engine: GenericDuplicateKeyException To: us...@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<deya...@flexbrix.com> wrote:
From: Deyan Tsvetanov<deya...@flexbrix.com> Subject: Entity Engine: GenericDuplicateKeyException To: us...@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





