2012-03-14 9 views
4

grails 도메인 클래스에서 beforUpdate 이벤트를 구현하려고합니다. Domains 속성의 이전 값과 새 값 모두를 감사해야합니다. isDirty 체크를 사용하거나 도메인에 더러운 속성 목록을 반환하는 Domain.dirtyPropertyNames을 사용할 수 있습니다. 그리고 getPersistentValue은 두 값을 모두 가질 수 있도록 테이블에서 이전 값을 가져옵니다.grails에서 업데이트 된 도메인 속성의 이전 값을 가져 오는 중

도메인 클래스에서 beforUpdate 이벤트를 사용하고 여기에서 로깅 서비스를 호출하여 사용자 ID를 전달합니다 도메인. 이제이 ID를 사용하여 서비스의 사용자 인스턴스를 얻은 다음 위의 지정된 메소드를 사용하여 필드가 더티인지 확인 할 수 있습니까? 또는 실제로 UserController의 update def에서 Update를 수행 할 때 Audit을 기록해야합니까?

더 나은 접근 방법은 무엇입니까?

내가이 올바른 접근하면 확인하려는 ..
또한 내가 좋아하는,에 대한 치료를 취할 필요가 어떤 다른 것들 : 속성은 도메인 객체 참조와 간단하지 유형의 경우
1).
2) 도메인 클래스에서 서비스를 호출 할 때 구현할 생각으로 최대 절전 모드 세션을 비우지 않도록주의해야 할 다른 모든 것들.
감사
Priyank

편집 : 서비스의 방법에서

def beforeUpdate = { 
GraauditService service = AH.getApplication().getMainContext().getBean(''graauditService) 
     service.saveUserUpdateEntry(this.id); // id property of User domain... 
} 

는 내가 .. 내가 업데이트 활동에 대한 로그 감사 할 사용자 도메인의 beforeUpdate 이벤트에서이 시도 :


:
def saveUserUpdateEntry(Long id){ 
    User grauser = User.get(id); 
    println ("user="+ grauser) 
    println "Dirty Properties -: ${grauser.dirtyPropertyNames}" 
    println "Changed value for firstName = -: ${ grauser.firstName}" 
    println "Database value for firstName = -: ${ grauser.getPersistentValue('firstName')}" 

    } 

나는, 이름, 이메일의 UI에서 LASTNAME을 업데이트를 수행하고 콘솔에서 다음을 얻을려고

user=com.gra.register.User : 1 
Dirty Properties -: [eMail, firstName, lastName] 
Changed value for firstName = -: sefser 
Database value for firstName = -: administer 

user=com.gra.register.User : 1 
Dirty Properties -: [] 
Changed value for firstName = -: sefser 
Database value for firstName = -: sefser 
possible nonthreadsafe access to session 

나는 알 수 없습니다입니다 :
1) 왜 2 개 세트를 얻고있다 ... 두 번 전에 한 번 커밋라는 이벤트가 한 번 후 커밋 ... ?? 하이버 네이트 예외를 제거하거나 처리하는 방법
2) (audit logging plugin를 사용 감사 로깅 GORM 이벤트 핸들러를 사용하기보다는 .. 미리 기능하지만 차이

+0

이 pri_dev를 수행 할 수있는 방법이 많이 있으며, 최상의 접근 방법은 비즈니스 요구 사항에 따라 달라질 수 있습니다. 사용자가 변경 한 모든 변경 사항을 변경 하시겠습니까? 아니면 변경된 속성 만 변경 하시겠습니까? 얼마나 자주이 개체를 업데이트 할 것으로 예상합니까? 이러한 변경 사항을 GORM에 의해 매핑 된 데이터베이스, 로그 파일 ...에 유지할 계획입니까? –

+0

예, 데이터베이스의 AuditLog 도메인에 추가하고 싶습니다. beforeUpdate와 그 최대 절전 모드 예외로부터 서비스에 대한 간단한 호출을 시도했습니다. 편집 섹션을 추가했습니다 –

+0

도메인에서 2-3 개의 속성을 업데이트하고 save()를 호출하면 beforUpdate 이벤트가 호출되지만 Save 이벤트도 호출됩니다. create와 update가 모두 domain.save()에 대한 호출이기 때문에 나는 Hibernate가 현존 도메인의 새로운 Creation과 Update에 기반하여 다른 이벤트를 발생시킬만큼 똑똑한 지 알고 싶다. –

답변

0



감사 withNew 세션을 사용하는 것을 시도했다. 이것은 당신의 고통을 많이 빼앗아 것입니다.

희망이 도움이됩니다.

또는

을 당신은 훨씬 더 정밀한 제어를 원하는 경우에 당신이 무엇을 통해 당신은 Hibernate의 EmptyInterceptor의 서브 클래스를 사용하는 것을 고려해야 만한다. 이것은

  1. 당신에게 이상 더 세밀하게 제어 할 것인가에 대한 견인의 목적을 될 것입니다 무엇을 어떻게 당신이
  2. 당신이 유지 도움이됩니다, 한 곳에서 감사 로깅을위한 모든 논리를 배치합니다 로그인 감사를하고있는 당신의 암호.

Click here EmptyInterceptor 용 API를 확인하십시오.

: Hibernate는이 클래스의 모든 구현을 제공하지 않으며, 또한 당신에게 기본 동작을 제공 할 수있는이의 서브 클래스를 제공하지 않습니다. 따라서 사용자 정의 구현을 작성해야합니다.

+0

우리는 그것을 시도했으나 onLoad 이벤트를 기록하기 위해 (XYZ 한 번에 로그온 ..) 그들이 가지고있는 동일한 도메인을 사용하기가 어렵다 ... 그리고 우리는 2 테이블을 유지할 필요가 없다. 그래서 플러그인없이 모두 구현하기 위해서 패닝을하고, 또한 ID의 플러그인을 사용할 때 삭제되는 개체 ... –

+0

이 플러그인을 모르지만 이전 ID가 'oldmap'에 있다고 가정합니다. – Peter