2016-09-01 2 views
0

Ich bin derzeit erstellen eine Überwachung einiger Domain-Klassen und erstellt eine AuditingListener, die eine ServiceMethod aufruft, um die alten Daten zu speichern.GORM Vererbung benutzerdefinierte Kennung

In dieser Service-Methode erhalte ich die Prüfklasse der Domain Class bySome Namenskonventionen.

Das alles funktioniert gut, aber jetzt bin ich auf ein Problem mit der Audit-Klasse. Der Prüfungs Klasse erstreckt sich von der Basis Domain-Klasse wie folgt aus:

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

Mein Problem ist, dass ich in FooAudit die ID Foo behalten wollen und eine eigene ID-Eigenschaft. In der Service-Methode, die den Audit-Eintrag erstellen wird, bekomme ich eine Karte aller Eigenschaften des Ursprungs-Domain-Class-Objekts. Ich möchte mit dieser Karte die Eigenschaften von FooAudit setzen, aber die Karte enthält auch die id Eigenschaft von Fooo.

Wenn ich die Eigenschaften von der Karte wie

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

Hierdurch wird der von FooAudit identifizieren die gleiche wie Foo, aber ich möchte eine eigene haben identifizieren von FooAudit

Wie kann ich Stellen Sie die Eigenschaft auditId als Kennung von FooAudit?

Antwort

0

Vielleicht könnten Sie eine Basisklasse erstellen, die alle notwendigen Eigenschaften enthält?

class FooBase{ 
    String baaar 
} 

class Foo extends FooBase{ 
} 

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

Das könnte funktionieren, wenn ich nicht die 'id' von' Foo' in 'FooAudit' benötige, aber in diesem Fall brauche ich es. So würde das für mich nicht funktionieren ... – YAT

+0

Und wie machst du Audit? Du könntest FooAudit in 'beforeUpdate' Event von Foo einfügen. –

0

Als Beispiel, ich habe für den Fall von Eigenschaften mit speziellen Fällen Kopieren, eine Klasse mit statischen Methoden wie die Anhänger (vielleicht ist es nützlich ... und Sie können die ID, wie Sie mögen behandeln. ..)

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 
}