2012-03-14 2 views
4

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

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

Каков наилучший подход?

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

Edit: Я попробовал это в случае 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')}" 

    } 

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

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

+0

Существует множество способов сделать это pri_dev, и лучший подход, вероятно, зависит от требований бизнеса. Вы хотите, чтобы все изменения были внесены в Пользователь или были изменены только те свойства, которые были изменены? Как часто ожидают обновления этого объекта? Вы планируете сохранять эти изменения в базе данных, что-то отображаемое GORM, файл журнала ..? –

+0

Да, я хочу добавить его в AuditLog Domain в базу данных, я попытался выполнить простой вызов службы из beforeUpdate и его исключение для спящего режима. Я добавил раздел редактирования –

+0

Еще один действительно важный вопрос, который у меня есть: если я обновил 2-3 атрибута в домене и вызвал save(), вызывается событие beforUpdate, но также называется событие Save? так как оба создания и обновления являются вызовами domain.save() Я хочу знать, достаточно ли Hibernate для запуска другого события на основе нового создания и обновления существующего домена. –

ответ

0

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

Надеется, что это помогает.

или

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

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

Click here, чтобы увидеть API для EmptyInterceptor.

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

+0

Мы пробовали это, но для регистрации событий onLoad (например, XYZ во время входа в систему ...) его трудно использовать тот же домен, который у них есть ... И мы не будем поддерживать 2 таблицы, поэтому просто панорамируем для реализации всех без плагина, также я не знаю, как получить идентификатор объект, который удаляется ... при использовании плагина. –

+0

Я не знаю этого плагина, но я предполагаю, что старый идентификатор находится в «oldmap». – Peter

 Смежные вопросы

  • Нет связанных вопросов^_^