This data object like CayenneDataObject uses Map to store generic attributes,
only difference is that this Map will be created lazily at first write, thus reducing memory penalty if possible.

This class can be used as superclass for objects that have attributes created at runtime.
If generic runtime attributes will be used always it may be a good idea to use CayenneDataObject instead.
If you don't create attributes at runtime it is better to use BaseDataObject class.

Map creation is not thread safe, as DataObject in general not thread safe by it's own.

writePropertyDirectly

Modifies a value of a named property without altering the object state in any way,
and without triggering any database operations. This method is intended mostly for
internal use by Cayenne framework, and shouldn't be called from the application
code.