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