I've done some more poking at this, and modified JDBCUtil.setParameter as follows:
// // Binary types need to be converted to a byte array and set // if(isBinaryJDBCType(jdbcType)) { byte[] bytes = convertObjectToByteArray(value); if (bytes.length < 2000 && jdbcType != Types.BLOB) { // it's more efficient to use setBinaryStream for large // streams, and causes problems if not done on some DBMS // implementations ps.setBytes(index, bytes); } else { InputStream in = null; try { in = new ByteArrayInputStream(bytes); ps.setBinaryStream(index, in, bytes.length); } finally { safeClose(in); } } return; ie. Forget about the ByteArrayBlob class. This works fine when writing to the database. However, reading the data back fails: 2002-06-18 23:59:20,671 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.SimpleEJB] Executing SQL: SELECT booleanPrimitive, booleanObject, bytePrimitive, byteObject, shortPrimitive, shortObject, integerPrimitive, integerObject, longPrimitive, longObject, floatPrimitive, floatObject, doublePrimitive, doubleObject, stringValue, utilDateValue, sqlDateValue, timeValue, timestampValue, bigDecimalValue, byteArrayValue, objectValue FROM SIMPLE WHERE (id=?) 2002-06-18 23:59:20,680 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.id] Set parameter: index=1, jdbcType=VARCHAR, value=simple 2002-06-18 23:59:20,707 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.booleanPrimitive] Get result: index=1, javaType=boolean, Simple, value=true 2002-06-18 23:59:20,709 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.booleanObject] Get result: index=2, javaType=java.lang.Boolean, Simple, value=false 2002-06-18 23:59:20,713 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.bytePrimitive] Get result: index=3, javaType=byte, Simple, value=11 2002-06-18 23:59:20,715 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.byteObject] Get result: index=4, javaType=java.lang.Byte, Simple, value=22 2002-06-18 23:59:20,717 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.shortPrimitive] Get result: index=5, javaType=short, Simple, value=33 2002-06-18 23:59:20,718 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.shortObject] Get result: index=6, javaType=java.lang.Short, Simple, value=44 2002-06-18 23:59:20,720 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.integerPrimitive] Get result: index=7, javaType=int, Simple, value=55 2002-06-18 23:59:20,726 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.integerObject] Get result: index=8, javaType=java.lang.Integer, Simple, value=66 2002-06-18 23:59:20,728 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.longPrimitive] Get result: index=9, javaType=long, Simple, value=77 2002-06-18 23:59:20,730 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.longObject] Get result: index=10, javaType=java.lang.Long, Simple, value=88 2002-06-18 23:59:20,731 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.floatPrimitive] Get result: index=11, javaType=float, Simple, value=11.11 2002-06-18 23:59:20,733 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.floatObject] Get result: index=12, javaType=java.lang.Float, Simple, value=22.22 2002-06-18 23:59:20,735 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.doublePrimitive] Get result: index=13, javaType=double, Simple, value=33.33 2002-06-18 23:59:20,738 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.doubleObject] Get result: index=14, javaType=java.lang.Double, Simple, value=44.44 2002-06-18 23:59:20,740 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.stringValue] Get result: index=15, javaType=java.lang.String, Simple, value=test string value 2002-06-18 23:59:20,742 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.utilDateValue] Get result: index=16, javaType=java.util.Date, Simple, value=1970-01-01 11:00:01.111 2002-06-18 23:59:20,744 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.sqlDateValue] Get result: index=17, javaType=java.sql.Date, Simple, value=1981-05-05 2002-06-18 23:59:20,746 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.timeValue] Get result: index=18, javaType=java.sql.Time, Simple, value=22:33:44 2002-06-18 23:59:20,748 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.timestampValue] Get result: index=19, javaType=java.sql.Timestamp, Simple, value=1970-01-01 11:00:04.444 2002-06-18 23:59:20,749 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.bigDecimalValue] Get result: index=20, javaType=java.math.BigDecimal, Simple, value=12345678 2002-06-18 23:59:20,751 TRACE [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.byteArrayValue] Get result: index=21, javaType=[B, Simple, value=[B@2b8a17 2002-06-18 23:59:20,758 TRACE [org.jboss.ejb.plugins.EntitySynchronizationInterceptor] loadEntity Exception, clear tx for ctx=org.jboss.ejb.EntityEnterpriseContext@74683e, tx=TransactionImpl:XidImpl [FormatId=257, GlobalId=edoras.resolvesw.com.au//40, BranchQual=] 2002-06-18 23:59:20,760 TRACE [org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy] entryRemoved, entry=key: null, object: null, entry: 67e62c 2002-06-18 23:59:20,762 TRACE [org.jboss.ejb.plugins.EntityInstanceInterceptor] Ending invoke, exceptionThrown, ctx=org.jboss.ejb.EntityEnterpriseContext@74683e 2002-06-18 23:59:20,764 TRACE [org.jboss.ejb.plugins.EntityInstanceInterceptor] End invoke, key=simple, ctx=org.jboss.ejb.EntityEnterpriseContext@74683e 2002-06-18 23:59:20,765 TRACE [org.jboss.ejb.plugins.EntityLockInterceptor] End invoke, key=simple 2002-06-18 23:59:20,766 TRACE [org.jboss.ejb.plugins.TxInterceptorCMT] TxInterceptorCMT: In finally 2002-06-18 23:59:20,770 ERROR [org.jboss.ejb.plugins.LogInterceptor] TransactionRolledbackException, causedBy: java.sql.SQLException: Unable to load to deserialize result: java.io.StreamCorruptedException: InputStream does not contain a serialized object at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.convertByteArrayToObject (JDBCUtil.java:599) at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.getResult(JDBCUtil.java:306) at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.loadArgumentResults( JDBCAbstractCMPFieldBridge.java:350) at org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.loadInstanceResults( JDBCAbstractCMPFieldBridge.java:304) at org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.execute (JDBCLoadEntityCommand.java:142) at org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.execute (JDBCLoadEntityCommand.java:62) at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.loadEntity (JDBCStoreManager.java:569) at org.jboss.ejb.plugins.CMPPersistenceManager.loadEntity (CMPPersistenceManager.java:410) at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.loadEntity( CachedConnectionInterceptor.java:353) at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke (EntitySynchronizationInterceptor.java:262) at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke (CachedConnectionInterceptor.java:186) at org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke (EntityInstanceInterceptor.java:152) at org.jboss.ejb.plugins.EntityLockInterceptor.invoke(EntityLockInterceptor.java: 107) at org.jboss.ejb.plugins.EntityCreationInterceptor.invoke (EntityCreationInterceptor.java:69) at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext (AbstractTxInterceptor.java:96) at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions (TxInterceptorCMT.java:176) at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:61) at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java: 129) at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:183) at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke (ProxyFactoryFinderInterceptor.java:156) at org.jboss.ejb.EntityContainer.invoke(EntityContainer.java:482) at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke (BaseLocalProxyFactory.java:304) at org.jboss.ejb.plugins.local.EntityProxy.invoke(EntityProxy.java:38) at $Proxy41.getBooleanPrimitive(Unknown Source) at org.jboss.test.cmp2.simple.SimpleUnitTestCase.testBooleanPrimitive (SimpleUnitTestCase.java:90) at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:166) at junit.framework.TestCase.runBare(TestCase.java:140) at net.sourceforge.junitejb.EJBTestCase.runBare(EJBTestCase.java:133) at net.sourceforge.junitejb.EJBTestRunnerBean.runTestCase(EJBTestRunnerBean.java: 102) at net.sourceforge.junitejb.EJBTestRunnerBean.run(EJBTestRunnerBean.java:44) at java.lang.reflect.Method.invoke(Native Method) at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke (StatelessSessionContainer.java:606) at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke (CachedConnectionInterceptor.java:186) at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext (AbstractTxInterceptor.java:96) at org.jboss.ejb.plugins.AbstractTxInterceptorBMT.invokeNext (AbstractTxInterceptorBMT.java:144) at org.jboss.ejb.plugins.TxInterceptorBMT.invoke(TxInterceptorBMT.java:62) at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke (StatelessSessionInstanceInterceptor.java:77) at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java: 129) at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:183) at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke (ProxyFactoryFinderInterceptor.java:156) at org.jboss.ejb.StatelessSessionContainer.invoke(StatelessSessionContainer.java: 303) at org.jboss.ejb.Container.invoke(Container.java:687) at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:549) at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:321) at java.lang.reflect.Method.invoke(Native Method) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:241) at sun.rmi.transport.Transport$1.run(Transport.java:152) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:148) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:465) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java: 706) at java.lang.Thread.run(Thread.java:496) 2002-06-18 23:59:20,789 TRACE [org.jboss.ejb.plugins.LogInterceptor] End method=getBooleanPrimitive This seems to indicate that the BLOB was reloaded correctly, but the OBJECT column was fubar. A possible cause of this is that I don't think that you can use ResultSet.getBytes to recover the data from a BLOB that was written with PreparedStatement.setBinaryStream. Unfortunately, it will be another day before I can pursue this further. On Sunday, June 16, 2002, at 03:28 PM, Dain Sundstrom wrote: > I just committed the code from patch [ 525663 ] CMP and oracle blobs. > Can some with Oracle check if the code actually works? > > The following command will execute a new test I added which has a field > of every type: > > ./build.sh -Dtest=org.jboss.test.cmp2.simple.SimpleUnitTestCase one-test > > You'll need to change the datasource and datasource-mapping in the > src/resources/cmp2/simple/META-INF/jbosscmp-jdbc.xml file. > > This won't work perfectly for every database vendor, because some > vendor's don't support millisecond precise time and nanosecond precise > timestamp values. The test that is important for blobs is > testObjectValue. ---------------------------------------------------------------------------- Bringing you mounds of caffeinated joy >>> http://thinkgeek.com/sf <<< _______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development