Я пытаюсь реализовать событие 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 сессию в функции, но нет никакой разницы
Заранее спасибо ..
Существует множество способов сделать это pri_dev, и лучший подход, вероятно, зависит от требований бизнеса. Вы хотите, чтобы все изменения были внесены в Пользователь или были изменены только те свойства, которые были изменены? Как часто ожидают обновления этого объекта? Вы планируете сохранять эти изменения в базе данных, что-то отображаемое GORM, файл журнала ..? –
Да, я хочу добавить его в AuditLog Domain в базу данных, я попытался выполнить простой вызов службы из beforeUpdate и его исключение для спящего режима. Я добавил раздел редактирования –
Еще один действительно важный вопрос, который у меня есть: если я обновил 2-3 атрибута в домене и вызвал save(), вызывается событие beforUpdate, но также называется событие Save? так как оба создания и обновления являются вызовами domain.save() Я хочу знать, достаточно ли Hibernate для запуска другого события на основе нового создания и обновления существующего домена. –