Storing BigDecimal

This topic applies to Java version only

Problem

BigDecimal objects can't be stored by db4o with the default configuration:

Configuration configuration = Db4o.newConfiguration();

BigDecimalExample.java: storeBigDecimal
01public static void storeBigDecimal(Configuration configuration) { 02 new File(DB4O_FILE_NAME).delete(); 03 ObjectContainer container = database(configuration); 04 if (container != null) { 05 try { 06 BigDecimal d = new BigDecimal("-918.099995e-15"); 07 System.out.println("BigDecimal value: " + d); 08 09 container.set(d); 10 11 container.commit(); 12 } catch (Exception ex) { 13 System.out.println("Exception: " + ex.toString()); 14 } finally { 15 closeDatabase(); 16 } 17 } 18 }
BigDecimalExample.java: retrieveBigDecimal
01public static void retrieveBigDecimal(Configuration configuration) { 02 ObjectContainer container = database(configuration); 03 if (container != null) { 04 try { 05 ObjectSet result = container.query(BigDecimal.class); 06 listResult(result); 07 08 } catch (Exception ex) { 09 System.out.println("Exception: " + ex.toString()); 10 } finally { 11 closeDatabase(); 12 } 13 } 14 }

Reason

java.math.BigDecimal class contains some transient fields, which prevents it from being stored correctly.

Solution

The problem can be solved by applying the following configuration to the object container:

BigDecimalExample.java: configure
1private static Configuration configure() { 2 Configuration configuration = Db4o.newConfiguration(); 3 //configuration.objectClass(BigDecimal.class).callConstructor(true); 4 configuration.objectClass(BigDecimal.class).storeTransientFields(true); 5 return configuration; 6 }

Try to run storeBigDecimal and retrieveBigDecimal methods using the new configuration.