2016-12-16 7 views
0

현재 AuditListener를 개발하여 원하는 모든 DomainClass에 대한 History Entry를 만듭니다. Grails는 GORM 매핑을 읽습니다.

가 나는 AuditListener

클래스 AuditingListener이 AbstractPersistenceEventListener {

public AuditingListener(final Datastore datastore){ 
    super(datastore) 
} 

@Override 
protected void onPersistenceEvent(final AbstractPersistenceEvent event){ 
    switch(event.eventType){ 
     case EventType.PostInsert: 
      onPostInsert(event as PostInsertEvent) 
      break 
     case EventType.PreUpdate: 
      onPreUpdate(event as PreUpdateEvent) 
      break 
     case EventType.PreDelete: 
      onPreDelete(event as PreDeleteEvent) 
      break 
    } 
} 

def onPreUpdate(PreUpdateEvent event){ 
    Object domainClassObject = event.entityObject 
    PersistentEntity entity = event.entity 

    if(isAuditableEntity(domainClassObject)){ 
     try { 
      GrailsDomainClass grailsDomainClass = getGrailsDomainClass(domainClassObject) 
      Set<String> propertyNames = getPropertyNames(grailsDomainClass) 
      if(propertyNames){ 
       Map properties = getPropertiesMap(propertyNames, domainClassObject, grailsDomainClass) 
       createRevisionEntity(entity, grailsDomainClass, domainClassObject, properties) 
      } 

     } catch(Exception e){ 
      log.error "Could not found Audit domainClassObject Class of ${domainClassObject}", e 
     } 
    } 
} 

가 지금은 현재의 엔티티에 대한 개정을 만들어야합니다 방법 createRevisionEntity를 만들 확장 만들었습니다. 메서드는 RevisionEntity이라는 새 개체를 만들고 현재 DomainClassObject의 모든 속성을 동적으로 추가해야합니다. 그로 인해 나는 원하는 모든 DomainClass의 Revisioned Entity를 가지게 될 것이고 Envers를 최대 절전 모드로 전환하는 것과 유사합니다.

동적으로 속성을 RevisionEntity에 넣을 수는 있지만 문제는 매핑 정보를 얻지 못하고 RevisionEntity에 넣었습니다.

나에게 어떤 제안이 있습니까?

+0

당신이 감사 로그 플러그인 봤어을? 그것은 우리의 손에서 잘 작동합니다. – helgew

답변

0

열 매핑 geht 할 수있는 솔루션을 발견하는 경우 :

GrailsDomainBinder grailsDomainBinder = new GrailsDomainBinder() 
    grailsDomainBinder.getMapping(domainClassObject.class).columns?.each{column -> 
     println column 
    }