@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 @Override
 public void addGeneralLocationDatumMetadata(
     Long locationId, String sourceId, GeneralDatumMetadata meta) {
   assert locationId != null;
   assert sourceId != null;
   assert meta != null;
   LocationSourcePK pk = new LocationSourcePK(locationId, sourceId);
   GeneralLocationDatumMetadata gdm = generalLocationDatumMetadataDao.get(pk);
   GeneralDatumMetadata newMeta = meta;
   if (gdm == null) {
     gdm = new GeneralLocationDatumMetadata();
     gdm.setCreated(new DateTime());
     gdm.setId(pk);
     newMeta = meta;
   } else if (gdm.getMeta() != null && gdm.getMeta().equals(meta) == false) {
     newMeta = new GeneralDatumMetadata(gdm.getMeta());
     newMeta.merge(meta, true);
   }
   if (newMeta != null && newMeta.equals(gdm.getMeta()) == false) {
     // have changes, so persist
     gdm.setMeta(newMeta);
     generalLocationDatumMetadataDao.store(gdm);
   }
 }
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 @Override
 public void storeGeneralLocationDatumMetadata(
     Long locationId, String sourceId, GeneralDatumMetadata meta) {
   assert locationId != null;
   assert sourceId != null;
   assert meta != null;
   LocationSourcePK pk = new LocationSourcePK(locationId, sourceId);
   GeneralLocationDatumMetadata gdm = generalLocationDatumMetadataDao.get(pk);
   if (gdm == null) {
     gdm = new GeneralLocationDatumMetadata();
     gdm.setCreated(new DateTime());
     gdm.setId(pk);
     gdm.setMeta(meta);
   } else {
     gdm.setMeta(meta);
   }
   generalLocationDatumMetadataDao.store(gdm);
 }