2016-09-01 2 views
0

В настоящее время я создаю аудит некоторых классов домена и создал AuditingListener, который вызывает ServiceMethod для сохранения старых данных.GORM inheritance custom Identifier

В этом сервисном методе я получаю класс аудита класса домена по правилам именования.

Что все работает нормально, но теперь я направляюсь к проблеме с классом аудита. Ревизионная Класс простирается от основания домена класса, как это:

class Foo { 
    String baaar 
}  
class FooAudit extends Foo { 
    Long auditId 
    Date auditDate = new Date() 
} 

Моя проблема заключается в том, что я хочу, чтобы держать в FooAudit идентификатор Foo и иметь собственное свойство идентификатора. В методе обслуживания, который создаст запись аудита, я получаю карту всех свойств исходного объекта класса домена. Я хотел бы установить с этой картой свойства FooAudit, но карта также содержит id объект Fooo.

Если я установить свойства на карте, как

def auditEntry = new FooAudit() 
auditEntry.properties = map 

это было бы установить определить из FooAudit такой же, как Foo, но я хочу иметь собственный определить из FooAudit

Как я могу установить свойство auditId как идентификатор FooAudit?

ответ

0

Возможно, вы могли бы создать один базовый класс, который сохранил бы все необходимые свойства?

class FooBase{ 
    String baaar 
} 

class Foo extends FooBase{ 
} 

class FooAudit extends FooBase { 
    Long auditId 
    Date auditDate = new Date() 
} 
+0

Это может сработать, если мне не нужно 'id'' Foo' в 'FooAudit', но в этом случае мне это нужно. Так что это не сработает для меня ... – YAT

+0

И как вы проводите аудит? Вы можете вставить FooAudit в событие beforeOpdate для Foo. –

0

В качестве примера, у меня есть, в случае копирования свойств с помощью специальных случаев, класс со статическими методами, например, следующие (может быть, это полезно ... и вы можете обрабатывать идентификатор, как вам нравится. ..)

static def fillObjectProperties(def map, def obj, def excludeArray, def typeConvMap) { 
    map.each { 
     if (obj.hasProperty(it.key) && !excludeArray.contains(it.key)) { 
      try { 
       if (it.value == null || it.value.size() == 0) { 
        obj.setProperty(it.key, null) 
       } 
       else if (typeConvMap.containsKey(it.key)) { 
        if (typeConvMap[it.key] == 'int') { 
         obj.setProperty(it.key, it.value as int) 
        } else if (typeConvMap[it.key] == 'BigDecimal') { 
         obj.setProperty(it.key, it.value as BigDecimal) 
        } else if (typeConvMap[it.key] == 'Date') { 
         Date date = new Date() 
         date.clearTime() 
         date.set(date: map[it.key + '_day'] as int, month: (map[it.key + '_month'] as int) -1, year: map[it.key + '_year'] as int) 
         obj.setProperty(it.key, date) 
        } 
       } else { 
        obj.setProperty(it.key, it.value) 
       } 
      } catch(Exception ex) {} 
     } 
    } 
} 

static def copyObjectProperties(def source, def target) { 
    target.metaClass.properties.each{ 
     if (it.name != 'metaClass') { 
      it.setProperty(target, source.metaClass.getProperty(source, it.name)) 
     } 
    } 
    return source 
}