Return-Path: Delivered-To: apmail-openjpa-dev-archive@www.apache.org Received: (qmail 39052 invoked from network); 19 Jun 2008 00:58:37 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 19 Jun 2008 00:58:37 -0000 Received: (qmail 57737 invoked by uid 500); 19 Jun 2008 00:58:38 -0000 Delivered-To: apmail-openjpa-dev-archive@openjpa.apache.org Received: (qmail 57692 invoked by uid 500); 19 Jun 2008 00:58:38 -0000 Mailing-List: contact dev-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list dev@openjpa.apache.org Received: (qmail 57680 invoked by uid 99); 19 Jun 2008 00:58:38 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Jun 2008 17:58:38 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 19 Jun 2008 00:57:56 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 3D18F234C147 for ; Wed, 18 Jun 2008 17:57:45 -0700 (PDT) Message-ID: <836214363.1213837065249.JavaMail.jira@brutus> Date: Wed, 18 Jun 2008 17:57:45 -0700 (PDT) From: "Pinaki Poddar (JIRA)" To: dev@openjpa.apache.org Subject: [jira] Commented: (OPENJPA-458) OpenJPA doesn't throw standard JPA exceptions In-Reply-To: <8317368.1196718463384.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/OPENJPA-458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12606161#action_12606161 ] Pinaki Poddar commented on OPENJPA-458: --------------------------------------- Introduced a file-based configuration "sql-error-state-codes.xml" to narrow down the SQL exceptions. Michael is right about each database/JDBC driver throwing their own error codes on the same/similar error (e.g. DuplicateKeyException). The content of "sql-error-state-codes.xml" is error codes for each database we support categorized into the same subtypes of StoreException. The error codes in this file is currently gleaned from a similar file supplied in Spring framework. Also because of *when* an exception is raised can be different than *when* user called a method (for example, an EntityExistsException can be raised at commit time and not when user called em.persist(new Entity()), the real exception is often wrapped in a javax.persistence.Rollback or generic javax.persistence.PersistenceException. > OpenJPA doesn't throw standard JPA exceptions > --------------------------------------------- > > Key: OPENJPA-458 > URL: https://issues.apache.org/jira/browse/OPENJPA-458 > Project: OpenJPA > Issue Type: Bug > Components: jpa > Affects Versions: 1.0.1 > Environment: OpenJPA 1.0.0 > Windows > Reporter: Gul Onural > Assignee: Pinaki Poddar > Priority: Critical > > OpenJPA doesn't throw standard JPA exceptions in the case of failure to persist or commit. > For example, the JPA spec states that the EntityExistsException is thrown by the persistence provider when EntityManager.persist(Object) is called and the entity already exists. > However, the OpenJPA never raises the EntityExistsException, instead raises RollbackException. > In order to produce the issue, just take the hellojpa example comes with the OpenJPA distro. and modify Message.java to make > variable message an ID (original Message class uses timestamp as ID, just change the ID to be message variable for the purpose of reproducing the issue explained here) : > @Id > private String message; > Then run the hellojpa after this very simple modification, twice. Second execution fails because of duplicate key. The stack trace is captured below and notice that there is no EntityExistsException in the stack trace at all. > Because of this, the caller of the jpa objects cannot differenciate EntityExistsException from any other exception and for example the GUI cleints cannot display meaningful error code to reflect exactly what happend. > Here is the stack trace : > Buildfile: D:\apache-openjpa-1.0.0\examples\hellojpa\build.xml > pre-compile: > compile: > run: > [java] 3063 hellojpa TRACE [main] openjpa.jdbc.SQL - executing prepstmnt 28409161 INSERT INTO Message (message, created, id) VALUES (?, ?, ?) [params=(String) Hello Persistence!, (Timestamp) 2007-12-03 15:59:24.663, (long) 1196715564663] > [java] 3157 hellojpa TRACE [main] openjpa.jdbc.SQL - [94 ms] spent > [java] Exception in thread "main" org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. > [java] at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:419) > [java] at hellojpa.Main.main(Main.java:53) > [java] Caused by: org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. > [java] at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2099) > [java] at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1946) > [java] at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1844) > [java] at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1762) > [java] at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > [java] at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1292) > [java] at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > [java] at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:408) > [java] ... 1 more > [java] Caused by: org.apache.openjpa.persistence.PersistenceException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL071203035857400' defined on 'MESSAGE'. {prepstmnt 28409161 INSERT INTO Message (message, created, id) VALUES (?, ?, ?) [params=(String) Hello Persistence!, (Timestamp) 2007-12-03 15:59:24.663, (long) 1196715564663]} [code=20000, state=23505] > [java] FailedObject: hellojpa.Message@89e2f1 > [java] at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:3849) > [java] at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:97) > [java] at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:67) > [java] at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:108) > [java] at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:73) > [java] at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:543) > [java] at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:105) > [java] at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89) > [java] at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72) > [java] at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:514) > [java] at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > [java] ... 8 more > [java] Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL071203035857400' defined on 'MESSAGE'. {prepstmnt 28409161 INSERT INTO Message (message, created, id) VALUES (?, ?, ?) [params=(String) Hello Persistence!, (Timestamp) 2007-12-03 15:59:24.663, (long) 1196715564663]} [code=20000, state=23505] > [java] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192) > [java] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:57) > [java] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:858) > [java] at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269) > [java] at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1363) > [java] at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:97) > [java] ... 15 more > BUILD FAILED > D:\apache-openjpa-1.0.0\examples\build.xml:84: Java returned: 1 > Total time: 6 seconds -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.