Hi Wanyna,Whenever you query for entities, the result entities are put into your persistence context. So when you then try to persist another entity with the same identity the provider finds the query result in the persistence context and throws EntityExistsException.
Craig On Apr 4, 2007, at 9:47 PM, wanyna wrote:
Your explaination is clearly if I only show my test case 1.My test case 2, add a query before persist, then get EntityExistsException. The result of query hold some object no association with the object topersist. Why this time the object exists in persistence context? Craig L Russell wrote:If you look at the exception that is thrown from the database, it's a pretty general exception. "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 'SQL070403054930170' defined on 'BSC'." This might have been caused by a unique constraint, which would not be properly reported as EntityExistsException. Sadly, there is no standard SQL exception that specifically tells the provider (OpenJPA) that there was a primary key constraint violation. And you might also note that every database has its own way to report exceptions like this. What the EntityExistsException does is to report that there is already an entity with the same primary key in the persistence context. It doesn't report that there was a problem writing the entity to the database. If you're looking for better error reporting you can flush as part of the application-level persist operation. That way your application can catch a persistence exception that is caused either by persist or flush and report it as a "problem persisting entity" to your caller. But there is a down side to this. If you flush immediately after persist, the provider cannot optimize for performance. So it's a tradeoff that you need to make in your application. If you're keen on "fixing" this situation, I'd encourage you to volunteer to look at the databases and how they report unique and primary key constraint violations and see if it's possible to parse the sql code and report string to positively identify a primary key constraint violation. Craig On Apr 3, 2007, at 9:42 PM, wanyna wrote:I can't find EntityExistsException nested in RollbackExceptions. http://www.nabble.com/file/7646/exception.jpg Will exception mechanism be planned to improve? I think it's very important. Patrick Linskey wrote:Cool -- that explains it then. EM.commit() must throw RollbackExceptions (and org.apache.openjpa.persistence.RollbackException extends javax.persistence.RollbackException) when the transaction is rolled back during the course of the commit. If you get the nested exception from the RollbackException, I bet that it's instanceof EntityExistsException. Clearly, however, something is wonky with our exception printing algorithm. -Patrick -- Patrick Linskey BEA Systems, Inc.___________________________________________________________________ ____ Notice: This email message, together with any attachments, may contain information of BEA Systems, Inc., its subsidiaries and affiliated entities, that may be confidential, proprietary, copyrighted and/or legally privileged, and is intended solely for the use of the individual or entity named in this message. If you are not the intended recipient, and have received this message in error, please immediately return this by email and then delete it.-----Original Message----- From: wanyna [mailto:[EMAIL PROTECTED] Sent: Tuesday, April 03, 2007 8:49 PM To: open-jpa-dev@incubator.apache.org Subject: RE: why not an EntityExistsException was thrown? actual class of the exception: class org.apache.openjpa.persistence.RollbackException <2|true|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. at org.apache.openjpa.persistence.EntityManagerImpl.commit(Entity ManagerImpl.java:417) at test.Main.main(Main.java:82) Caused by: <0|true|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerI mpl.java:2091) at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1938) atorg.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java: 1836)at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerIm pl.java:1754) at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalMana gedRuntime.java:76) at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1311) at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBr oker.java:863) at org.apache.openjpa.persistence.EntityManagerImpl.commit(Entity ManagerImpl.java:406) ... 1 more Caused by: <0|false|0.9.7-incubating-SNAPSHOT> 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 'SQL070403054930170' defined on 'BSC'. {prepstmnt 15774883 INSERT INTO BSC (objid, objname, created, msc_name, objclass) VALUES (?, ?, ?, ?, ?) [params= (long) 1, (String) objname1, (Timestamp) 2006-05-04 18:13:51.0, (String) objname0, (String) bsc]} [code=-1, state=23505] FailedObject: [EMAIL PROTECTED] at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBD ictionary.java:3764) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptio ns.java:94) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptio ns.java:64) at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ushInternal(PreparedStatementManagerImpl.java:103) at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ush(PreparedStatementManagerImpl.java:68) at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flu shPrimaryRow(OperationOrderUpdateManager.java:200) at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flu sh(OperationOrderUpdateManager.java:86) at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(Abs tractUpdateManager.java:86) at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(Abs tractUpdateManager.java:69) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStor eManager.java:511) at org.apache.openjpa.kernel.DelegatingStoreManager.flush(Delegat ingStoreManager.java:127) ... 8 more 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 'SQL070403054930170' defined on 'BSC'. {prepstmnt 15774883 INSERT INTO BSC (objid, objname, created, msc_name, objclass) VALUES (?, ?, ?, ?, ?) [params= (long) 1, (String) objname1, (Timestamp) 2006-05-04 18:13:51.0, (String) objname0, (String) bsc]} [code=-1, state=23505] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(Lo ggingConnectionDecorator.java:188) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:53)at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$Logging Connection$LoggingPreparedStatement.executeUpdate(LoggingConne ctionDecorator.java:854) at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.execut eUpdate(DelegatingPreparedStatement.java:266) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1360)at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ushInternal(PreparedStatementManagerImpl.java:92) ... 15 more FailedObject:null Patrick Linskey wrote:<2|true|0.9.7-incubating-SNAPSHOT>org.apache.openjpa.util.StoreException: You definitely should not be getting that exception --OpenJPA shouldonly be throwing exception types that are in the org.apache.openjpa.persistence package and sub-packages.Can you print out the actual class of the exception that is thrown(i.e., System.err.println(e.getClass()) just in case theexception isjust doing a bad job of printing itself out? Thanks, -Patrick -- Patrick Linskey BEA Systems, Inc.______________________________________________________________ _________Notice: This email message, together with any attachments,may containinformation of BEA Systems, Inc., its subsidiaries andaffiliatedentities, that may be confidential, proprietary,copyrighted and/orlegally privileged, and is intended solely for the use ofthe individualor entity named in this message. If you are not theintended recipient,and have received this message in error, please immediatelyreturn thisorg.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java: 1836)by email and then delete it.-----Original Message----- From: wanyna [mailto:[EMAIL PROTECTED] Sent: Tuesday, April 03, 2007 8:26 PM To: open-jpa-dev@incubator.apache.org Subject: why not an EntityExistsException was thrown? I was confused in result of my test cases. My test is about JPA exceptions. I use derby in my tests. The first case is simply persist an object, the PK of the object has existed in database, so exception arose. entityManager = factory.createEntityManager(); entityManager.getTransaction().begin(); ... entityManager.persist(anObject); entityManager.getTransaction().commit(); exception is: <2|true|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.util.StoreException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred. at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerI mpl.java:2091) at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1938) atat org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerIm pl.java:1754) at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalMana gedRuntime.java:76) atorg.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java: 1311)at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBr oker.java:863) at org.apache.openjpa.persistence.EntityManagerImpl.commit(Entity ManagerImpl.java:406) at test.Main.main(Main.java:82) Caused by: <2|false|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.util.StoreException: The statement was aborted because itwould have caused a duplicate key value in a unique or primary keyconstraint or unique index identified by 'SQL070403054930170' defined on 'BSC'. {prepstmnt 15774883 INSERT INTO BSC (objid,objname, created,msc_name, objclass) VALUES (?, ?, ?, ?, ?) [params=(long)1, (String)objname1, (Timestamp) 2006-05-04 18:13:51.0, (String) objname0, (String) bsc]} [code=-1, state=23505] FailedObject: [EMAIL PROTECTED] at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBD ictionary.java:3764) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptio ns.java:94) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptio ns.java:64) at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ushInternal(PreparedStatementManagerImpl.java:103) at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ush(PreparedStatementManagerImpl.java:68) at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flu shPrimaryRow(OperationOrderUpdateManager.java:200) at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flu sh(OperationOrderUpdateManager.java:86) at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(Abs tractUpdateManager.java:86) at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(Abs tractUpdateManager.java:69) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStor eManager.java:511) at org.apache.openjpa.kernel.DelegatingStoreManager.flush(Delegat ingStoreManager.java:127) ... 8 more 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 'SQL070403054930170' defined on 'BSC'. {prepstmnt 15774883 INSERT INTO BSC(objid, objname,created, msc_name, objclass) VALUES (?, ?, ?, ?, ?)[params=(long) 1,(String) objname1, (Timestamp) 2006-05-04 18:13:51.0, (String) objname0, (String) bsc]} [code=-1, state=23505] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(Lo ggingConnectionDecorator.java:188) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:53)at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection> $LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:854) at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.execut eUpdate(DelegatingPreparedStatement.java:266) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1360)at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.fl ushInternal(PreparedStatementManagerImpl.java:92) ... 15 more I wonder why not an EntityExistsException was thrown? In the second case, I add a query before persist, entityManager = factory.createEntityManager(); /* * query before persist, even bofore transaction effects samely. * this query makes exception thrown in persist section difference. * it seems that query what entity is not important, * but must get result and result must has some record. */ entityManager.createQuery(jpql).getResultList(); entityManager.getTransaction().begin(); ... entityManager.persist(anObject); entityManager.getTransaction().commit(); exception: <2|false|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.persistence.EntityExistsException: An object of type "generate.Bsc" with oid "generate.Bsc-1:objname1" already exists in this context; another cannot be persisted. FailedObject: [EMAIL PROTECTED] atorg.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java: 2370)atorg.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java: 2206)at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingB roker.java:991) at org.apache.openjpa.persistence.EntityManagerImpl.persist(Entit yManagerImpl.java:526) at test.Main.main(Main.java:72) FailedObject:[EMAIL PROTECTED] An EntityExistsException was thrown this time, why? Exception is different, and when exception was thrown is also different. first case exception was caught at commit, second case, exception was caught at persist, why? -- View this message in context: http://www.nabble.com/why-not-an-EntityExistsException-was-thrown--tf3523673.html#a9830350Sent from the open-jpa-dev mailing list archive at Nabble.com.Notice: This email message, together with any attachments,may containinformation of BEA Systems, Inc., its subsidiaries andaffiliatedentities, that may be confidential, proprietary,copyrighted and/orlegally privileged, and is intended solely for the use ofthe individualor entity named in this message. If you are not theintended recipient,and have received this message in error, please immediatelyreturn this byemail and then delete it.-- View this message in context: http://www.nabble.com/why-not-an-EntityExistsException-was-thr own--tf3523673.html#a9830521 Sent from the open-jpa-dev mailing list archive at Nabble.com.Notice: This email message, together with any attachments, may contain information of BEA Systems, Inc., its subsidiaries and affiliated entities, that may be confidential, proprietary, copyrighted and/or legally privileged, and is intended solely for the use of the individual or entity named in this message. If you are not the intended recipient, and have received this message in error, please immediately return this by email and then delete it.-- View this message in context: http://www.nabble.com/why-not-an- EntityExistsException-was-thrown--tf3523673.html#a9830907 Sent from the open-jpa-dev mailing list archive at Nabble.com.Craig Russell DB PMC, OpenJPA PPMC [EMAIL PROTECTED] http://db.apache.org/jdo--View this message in context: http://www.nabble.com/why-not-an- EntityExistsException-was-thrown--tf3523673.html#a9850020Sent from the open-jpa-dev mailing list archive at Nabble.com.
Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!
smime.p7s
Description: S/MIME cryptographic signature