The logic used for updating model objects does not preserve existing metadata values. The base class for create/update requests is MetadataProvider and it starts with an empty map. The common update logic treats an empty map as a request to remove all metadata (SITEWHERE-146). Instead of inheriting from MetadataProvider, the requests should have a getMetadata() method which starts with a null value.
If a null is passed, the existing metadata is left unchanged.
If an empty map is passed, all values are removed.
If a populated map is passed, the existing values are replaced with the provided values.