2016-09-01 42 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 
}