Grails 3/GORM — запись в журнале при изменении записи

У меня есть следующий класс пользователя:

class User implements Serializable {

    private static final long serialVersionUID = 1

    transient springSecurityService

    String username
    String password
    String email

    String firstName
    String middleName
    String lastName

    ...

}

Я хочу создать новый объект домена UserNameChange при изменении имени, отчества или фамилии:

class UserNameChange {
    User user
    String firstName
    String middleName
    String lastName
}

Я знаю, что могу сделать это в транзакционной службе, но было бы лучше, если бы я мог сделать то же самое в классе User. Как я могу сделать это атомарно? Например, всегда ли "beforeUpdate" выполняется транзакционно?


person Anonymous1    schedule 17.03.2017    source источник


Ответы (1)


По умолчанию методы доменного класса НЕ являются транзакционными. Итак, вам придется использовать withTransaction():

class User {
  def beforeUpdate() {
    if( ![ 'firstName', 'middleName', 'lastName' ].any{ isDirty it } ) return 
    User.withTransaction{
      new UserNameChange( ... ).save()
    }
  }
}

Вы также можете взглянуть на плагин аудита

person injecteer    schedule 17.03.2017
comment
Разве это не поместит только сохранение UserNameChange в транзакцию и не откатится, если произошла ошибка при сохранении пользователя? - person Anonymous1; 17.03.2017
comment
Нет, не будет. Вы можете проверить действительность объекта пользователя внутри beforeUpdate - person injecteer; 17.03.2017
comment
если вам нужен правильный TX - используйте услугу, как вы упомянули - person injecteer; 17.03.2017