получение старых значений обновленных свойств домена в Grails - PullRequest
4 голосов
/ 15 марта 2012

Я пытаюсь реализовать событие beforUpdate в классах домена grails. Мне нужно проверять журнал как старых, так и новых значений атрибутов Domains.Я вижу, что мы можем использовать проверку isDirty или Domain.dirtyPropertyNames, которые возвращают список свойств, которые являются грязными в домене.и getPersistentValue получает старое значение в таблице, поэтому у меня могут быть оба значения.

Для реализации этого я буду использовать событие beforUpdate в классе домена и оттуда вызывать службу журналирования, передавая ейидентификатор домена пользователя.Теперь, используя этот идентификатор, я могу получить пользовательский экземпляр в Сервисе, а затем проверить, не загрязнены ли какие-либо поля, используя указанный выше метод?или мне нужно регистрировать Аудит, когда я на самом деле делаю Обновление в определении обновления UserController?

Какой подход лучше?

Я хочу подтвердить, если это правильный подход ..
Также о других вещах, о которых мне нужно позаботиться, например:
1) если атрибуты являются ссылками на объекты домена, а не простыми типами.
2) обо всех других вещах, о которых мне нужно позаботиться, например, о том, чтобы не сбрасывать сеанс гибернации, думая о реализации этого в обращении к услуге из класса домена.
С уважением,
Приянк

Редактировать: Я попытался сделать это в событии beforeUpdate в Домене пользователя, который я хочу, чтобы Журнал Аудита проверял активность ...

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

В методе в Сервисе я делаю:

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')}"

    }

Я пытаюсьсделать обновление из пользовательского интерфейса для электронной почты, имени, фамилии и получить на консоли следующее:

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) как удалить или обработать исключение Hibernate (пытался использовать с новым сеансом в функции, но без разницы

Заранее спасибо ..

1 Ответ

0 голосов
/ 15 марта 2012

Вместо использования обработчиков событий GORM для ведения журнала аудита используйте плагин ведения журнала аудита .Это отнимет у вас много боли.

Надеюсь, это поможет.

или

Если вы хотите гораздо более точный контроль над тем, что вы делаете, вы должны рассмотреть возможность использованияподкласс ПустойИнтерцептор Hibernate.Это послужит вам для целей буксировки

  1. . Это даст вам гораздо более точный контроль над тем, что и как вы делаете, ведя журнал аудита.
  2. Поместит всю вашу логику для ведения журнала аудита в одном месте,который поможет вам поддерживать ваш код.

Нажмите здесь , чтобы увидеть API для EmptyInterceptor.

Примечание : Hibernateне доставляет никакой реализации в этом классе, а также не предоставляет какой-либо подкласс этого, который может предоставить вам поведение по умолчанию.Поэтому вам придется написать собственную реализацию.

...