| Craig Russell (JIRA) 2006-01-06, 5:45 pm |
| [ http://issues.apache.org/jira/brows...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(ColumnCre
ator.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(AbstractPersisten
ceManager.java:1076)
> at org.jpox.AbstractPersistenceManager. makePersistent(AbstractPersistenceManage
r.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/secur...nistrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
|