From dev-return-11039-apmail-openjpa-dev-archive=openjpa.apache.org@openjpa.apache.org Mon Mar 16 19:08:16 2009 Return-Path: Delivered-To: apmail-openjpa-dev-archive@www.apache.org Received: (qmail 12298 invoked from network); 16 Mar 2009 19:08:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 16 Mar 2009 19:08:15 -0000 Received: (qmail 15323 invoked by uid 500); 16 Mar 2009 19:08:15 -0000 Delivered-To: apmail-openjpa-dev-archive@openjpa.apache.org Received: (qmail 15152 invoked by uid 500); 16 Mar 2009 19:08:15 -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 15140 invoked by uid 99); 16 Mar 2009 19:08:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 16 Mar 2009 12:08:15 -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; Mon, 16 Mar 2009 19:08:12 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 7F833234C004 for ; Mon, 16 Mar 2009 12:07:50 -0700 (PDT) Message-ID: <463213597.1237230470514.JavaMail.jira@brutus> Date: Mon, 16 Mar 2009 12:07:50 -0700 (PDT) From: "B.J. Reed (JIRA)" To: dev@openjpa.apache.org Subject: [jira] Updated: (OPENJPA-526) Insert text more than 4K bytes to Clob column causes SQLException: Exhausted Resultset In-Reply-To: <701666130.1204140591617.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/OPENJPA-526?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] B.J. Reed updated OPENJPA-526: ------------------------------ Attachment: OPENJPA-526.patch The code that is changed fixes 2 Oracle test problems with non nullable Clobs: 1. When the string is too large to fit in the Oracle Clob normally, an empty string gets passed into the setClobString method. This was causing the exception noted in this JIRA. 2. When the user wants to set the Clob to an empty string, the empty string gets passed into setClobString. OpenJPA would try to set the non nullable field to null. Also included is a test case. Lobs.java was not being used for any other tests, it looks like it was leftover from something else. http://issues.apache.org/jira/browse/OPENJPA-525 is NOT fixed yet with this change, even though it is closely related. > Insert text more than 4K bytes to Clob column causes SQLException: Exhausted Resultset > -------------------------------------------------------------------------------------- > > Key: OPENJPA-526 > URL: https://issues.apache.org/jira/browse/OPENJPA-526 > Project: OpenJPA > Issue Type: Bug > Affects Versions: 1.0.0, 1.0.2, 1.1.0, 1.2.0 > Environment: OpenJPA 1.0.0, 1.0.2 > Oracle XE 10g (JDBC driver 10.2.0.3.0 > JRE 1.5.0_13 > Reporter: Frank Le > Priority: Critical > Attachments: OPENJPA-526.patch > > > Here's the persistence class: > public class Exam... { > @Lob > @Column(name = "text", nullable = false) ***** NOTE: set nullable = true will fix the problem but it leads to bug OPENJPA-525 ***** > private String text; > } > Here are the differences with nullable = true: > INSERT INTO exam (id, text) VALUES (?, ?) [params=(long) 1, (Clob) oracle.sql.CLOB@d402dd] > SELECT t0.text FROM exam t0 WHERE t0.id = ? FOR UPDATE [params=(long) 1] > With nullable = false: > INSERT INTO exam (id, text) VALUES (?, ?) [params=(long) 1, (Reader) java.io.StringReader@1603522] > SELECT t0.text FROM exam t0 WHERE t0.id = ? FOR UPDATE [params=(long) 1] [code=1400, state=23000] > Here's the full stack trace: > [2008-02-27 10:43:51,232][main][org.apache.openjpa.lib.log.Log4JLogFactory$LogAdapter:72][DEBUG] executing prepstmnt 15029693 INSERT INTO exam (id, last_updated_by, comments, sustained_on, text, version, course_id, professor_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 11, (String) test, (null) null, (Date) 2008-02-27, (Reader) java.io.StringReader@da9ea4, (int) 1, (long) 1, (long) 8] > [2008-02-27 10:43:51,248][main][org.apache.openjpa.lib.log.Log4JLogFactory$LogAdapter:72][DEBUG] [16 ms] spent > [2008-02-27 10:43:51,248][main][org.apache.openjpa.lib.log.Log4JLogFactory$LogAdapter:72][DEBUG] executing prepstmnt 24422114 SELECT t0.text FROM exam t0 WHERE t0.id = ? FOR UPDATE [params=(long) 11] > [2008-02-27 10:43:51,279][main][org.apache.openjpa.lib.log.Log4JLogFactory$LogAdapter:72][DEBUG] [31 ms] spent > [2008-02-27 10:43:51,279][main][org.apache.openjpa.lib.log.Log4JLogFactory$LogAdapter:76][DEBUG] An exception occurred while ending the transaction. This exception will be re-thrown. > 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(BrokerImpl.java:2108) > at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1955) > at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1853) > at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1771) > at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1293) > at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:408) > at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:438) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632) > at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631) > at com.intellapps.university.service.impl.ServiceDahImpl$$EnhancerByCGLIB$$81ecf35d.insertExam() > at com.intellapps.university.service.impl.ServiceImpl.insertExam(ServiceImpl.java:98) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) > at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) > at $Proxy17.insertExam(Unknown Source) > at com.intellapps.university.app.Main.testInsertExamWithLongText(Main.java:103) > at com.intellapps.university.app.Main.main(Main.java:203) > Caused by: org.apache.openjpa.util.StoreException: Exhausted Resultset > at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:3946) > at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:97) > at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:83) > at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:59) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:96) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:514) > at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > ... 29 more > Caused by: java.sql.SQLException: Exhausted Resultset > at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) > at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) > at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) > at oracle.jdbc.driver.ScrollableResultSet.getOracleObject(ScrollableResultSet.java:510) > at oracle.jdbc.driver.ScrollableResultSet.getCLOB(ScrollableResultSet.java:1446) > at oracle.jdbc.driver.UpdatableResultSet.getCLOB(UpdatableResultSet.java:1639) > at oracle.jdbc.driver.UpdatableResultSet.getClob(UpdatableResultSet.java:982) > at org.apache.commons.dbcp.DelegatingResultSet.getClob(DelegatingResultSet.java:515) > at org.apache.openjpa.lib.jdbc.DelegatingResultSet.getClob(DelegatingResultSet.java:576) > at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedClobFieldStrategy.putData(MaxEmbeddedClobFieldStrategy.java:69) > at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedLobFieldStrategy.customUpdate(MaxEmbeddedLobFieldStrategy.java:162) > at org.apache.openjpa.jdbc.meta.strats.MaxEmbeddedLobFieldStrategy.customInsert(MaxEmbeddedLobFieldStrategy.java:140) > at org.apache.openjpa.jdbc.meta.FieldMapping.customInsert(FieldMapping.java:684) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager$CustomMapping.execute(AbstractUpdateManager.java:358) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:94) > ... 32 more > NestedThrowables: > org.apache.openjpa.util.ReferentialIntegrityException: ORA-01400: cannot insert NULL into ("TEST"."EXAM"."TEXT") > {prepstmnt 15029693 INSERT INTO exam (id, last_updated_by, comments, sustained_on, text, version, course_id, professor_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 11, (String) test, (null) null, (Date) 2008-02-27, (Reader) java.io.StringReader@da9ea4, (int) 1, (long) 1, (long) 8]} [code=1400, state=23000] > FailedObject: com.intellapps.university.core.model.Exam@1417690 > at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:3944) > at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:97) > at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:67) > at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:108) > at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:73) > at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flushPrimaryRow(OperationOrderUpdateManager.java:203) > at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flush(OperationOrderUpdateManager.java:89) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:514) > at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1955) > at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1853) > at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1771) > at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1293) > at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:408) > at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:438) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632) > at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631) > at com.intellapps.university.service.impl.ServiceDahImpl$$EnhancerByCGLIB$$81ecf35d.insertExam() > at com.intellapps.university.service.impl.ServiceImpl.insertExam(ServiceImpl.java:98) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) > at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) > at $Proxy17.insertExam(Unknown Source) > at com.intellapps.university.app.Main.testInsertExamWithLongText(Main.java:103) > at com.intellapps.university.app.Main.main(Main.java:203) > Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-01400: cannot insert NULL into ("TEST"."EXAM"."TEXT") > {prepstmnt 15029693 INSERT INTO exam (id, last_updated_by, comments, sustained_on, text, version, course_id, professor_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 11, (String) test, (null) null, (Date) 2008-02-27, (Reader) java.io.StringReader@da9ea4, (int) 1, (long) 1, (long) 8]} [code=1400, state=23000] > at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192) > at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:57) > at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:858) > at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1363) > at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:97) > ... 36 more > NestedThrowables: > java.sql.SQLException: ORA-01400: cannot insert NULL into ("TEST"."EXAM"."TEXT") > at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) > at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) > at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) > at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) > at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216) > at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966) > at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170) > at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339) > at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3423) > at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102) > at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269) > at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:856) > at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1363) > at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:97) > at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:73) > at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flushPrimaryRow(OperationOrderUpdateManager.java:203) > at org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flush(OperationOrderUpdateManager.java:89) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89) > at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72) > at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:514) > at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1955) > at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1853) > at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1771) > at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1293) > at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861) > at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:408) > at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:438) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662) > at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632) > at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631) > at com.intellapps.university.service.impl.ServiceDahImpl$$EnhancerByCGLIB$$81ecf35d.insertExam() > at com.intellapps.university.service.impl.ServiceImpl.insertExam(ServiceImpl.java:98) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) > at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) > at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) > at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) > at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) > at $Proxy17.insertExam(Unknown Source) > at com.intellapps.university.app.Main.testInsertExamWithLongText(Main.java:103) > at com.intellapps.university.app.Main.main(Main.java:203) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.