12.2 null Values

A field of an object type can have a null value in Java. The datastore you access may or may not support null values, and the support may vary depending on the type of the data. Therefore, you should specify how the JDO implementation should handle a field with a null value when it is written to a datastore that cannot store a null value.

The field element's null-value attribute in the metadata specifies how this situation should be handled. This attribute can be given one of the following values:

"none"

Indicates that a Java null value should be stored as a null in the datastore. If the datastore cannot store a null value, a JDOUserException is thrown.

"exception"

Indicates that a JDOUserException should always be thrown when a field has a null value, even if the datastore can store a null value for the field.

"default"

Indicates the implementation should convert the Java null value to the datastore's default value for the field's datatype.

If you do not provide a value for the null-value attribute, it defaults to "none". If you never want to store a field with a null value, then you should set the null-value attribute to "exception".

If the null-value attribute for a field is set to "default" and the field is null in a transaction, the datastore's default value is stored, based on the field's datastore datatype. The next transaction that accesses the instance will obtain this datastore default value. You will have lost the fact that the field was originally null.

For example, if an Integer field that is null is mapped to the datastore's representation of an integer value, you may get a value of zero stored in the datastore. The next transaction accessing the field will also get a zero and it will not know the field was originally null. Similarly, a String field with a null value could be written as a zero-length string in the datastore. There is no good way to represent a null collection in a relational database, but a collection field with a null value could be represented in the datastore as an empty collection. Furthermore, the default value used for a datatype may vary across datastores.