[
http://issues.apache.org/jira/browse/JDO-263?page=comments#action_12362010 ]
Craig Russell commented on JDO-263:
-----------------------------------
The way JPOX stores serialized data is found in org.jpox.store.rdbms.mapping.
Blob2RDBMSMapping. The code that transforms BigDecimal[ ] for storage is:
else if (value instanceof BigDecimal[ ])
{
byte[ ] data =
TypeConversionHelper.getByteArrayFromBigDecimalArray(value);
((PreparedStatement) ps).setBytes(param, data);
}
Looking at the code in JPOX org.jpox.util.TypeConversionHelper, we notice what
appears to be a big problem.
/**
* Convert an instance of our value class into a byte[].
*
* @param value Object to be converted
*
* @return converted byte array
*/
public static byte[] getByteArrayFromBigDecimalArray(Object value)
{
if (value == null)
{
return null;
}
BigDecimal[] a = (BigDecimal[]) value;
double[] d = new double[a.length];
for (int i=0; i < a.length; i++)
{
d[i] = a[i].doubleValue();
}
return getByteArrayFromDoubleArray(d);
}
It appears that to serialize a BigDecimal[ ] it would be better to avoid
converting the BigDecimal[ ] to a double[ ]. Converting to a double[ ] is where
the precision is lost. Some other techique for serializing BigDecimal[ ] is
needed here.
> TestArrayCollections: Field
> "org.apache.jdo.tck.pc.fieldtypes.ArrayCollections.ArrayOfObject1" is
> declared as a reference type (interface/Object) but no implementation classes
> of "java.lang.Object" have been found!
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: JDO-263
> URL: http://issues.apache.org/jira/browse/JDO-263
> Project: JDO
> Type: Bug
> Components: tck20
> Reporter: Michelle Caisse
> Assignee: Andy Jefferson
> Attachments: jdo-263.patch
>
> test(org.apache.jdo.tck.models.fieldtypes.TestArrayCollections)javax.jdo.JDOUserException:
> Field "org.apache.jdo.tck.pc.fieldtypes.ArrayCollections.ArrayOfObject1" is
> declared as a reference type (interface/Object) but no implementation classes
> of "java.lang.Object" have been found!
> at
> org.jpox.metadata.MetaDataUtils.getImplementationNamesForReferenceField(MetaDataUtils.java:594)
> at
> org.jpox.store.rdbms.table.ColumnCreator.createColumnsForReferenceField(ColumnCreator.java:184)
> at
> org.jpox.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:296)
> at
> org.jpox.store.rdbms.table.ColumnCreator.createColumns(ColumnCreator.java:95)
> at org.jpox.store.rdbms.table.ArrayTable.initialize(ArrayTable.java:83)
> at
> org.jpox.store.rdbms.RDBMSManager$ClassAdder.addClassTablesAndValidate(RDBMSManager.java:2404)
> at
> org.jpox.store.rdbms.RDBMSManager$ClassAdder.run(RDBMSManager.java:2033)
> at
> org.jpox.store.rdbms.RDBMSManager$MgmtTransaction.execute(RDBMSManager.java:1893)
> at org.jpox.store.rdbms.RDBMSManager.addClasses(RDBMSManager.java:479)
> at org.jpox.store.rdbms.RDBMSManager.addClass(RDBMSManager.java:493)
> at
> org.jpox.store.rdbms.RDBMSManager.getDatastoreClass(RDBMSManager.java:766)
> at
> org.jpox.state.StateManagerImpl.populateStrategyFields(StateManagerImpl.java:781)
> at org.jpox.state.StateManagerImpl.<init>(StateManagerImpl.java:584)
> at
> org.jpox.AbstractPersistenceManager.internalMakePersistent(AbstractPersistenceManager.java:1076)
> at
> org.jpox.AbstractPersistenceManager.makePersistent(AbstractPersistenceManager.java:1131)
> at
> org.apache.jdo.tck.models.fieldtypes.TestArrayCollections.runTest(TestArrayCollections.java:93)
> at
> org.apache.jdo.tck.models.fieldtypes.TestArrayCollections.test(TestArrayCollections.java:69)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:204)
> at
> org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:120)
> at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:95)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira