2016-09-01 70 views
0

我目前正在創建一些域類的審計,並創建了一個調用ServiceMethod來保存舊數據的AuditingListenerGORM繼承自定義標識符

在此服務方法中,我通過某些命名約定獲取域類的審覈類。

這一切工作正常,但現在我正在審覈類的問題。 審計類從基域類這樣的擴展:

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

我的問題是,我想保持在FooAuditFoo的ID,並有自己的id屬性。 在將創建審覈條目的服務方法中,我將獲取源域Domain Class對象的所有屬性的映射。 我想使用此地圖設置FooAudit的屬性,但該地圖還包含Foooid屬性。

如果我該地圖所設定的性能,如

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

如果我不需要FooAudit中'Foo'的'id',那麼可以工作,但在這種情況下我需要它。所以這不適合我... – YAT

+0

你是如何做審計?你可以在Foo的'beforeUpdate'事件中插入FooAudit。 –

0

舉個例子,我有,人有特殊的情況下複製性的情況下,如以下靜態方法的類(也許是有用的...你可以處理ID你喜歡的方式。 ..)

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 
}