Можно ли настроить классы домена для вставки новой записи вместо обновления при сохранении? - PullRequest
2 голосов
/ 25 августа 2010

Когда я изменяю объект домена, а не обновляю запись в базе данных, я хотел бы заархивировать старую запись и создать новую.Я хотел бы заставить GORM сделать это автоматически.

Например, если бы у меня был этот класс домена:

class User {
    String username
    String email
    Boolean active
}

, тогда я бы хотел

user.email = email
user.save()

установить для активного флага пользователя значение false, сохраняя запись старого электронного письма.Будет добавлена ​​новая запись с новым адресом электронной почты и active = true.

Это общий шаблон?Легко ли это сделать в доменном классе, чтобы это происходило прозрачно?

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Вы можете использовать событие GORM beforeUpdate в классе пользовательского домена (см. Документацию здесь и здесь ) с чем-то вроде следующего, должно работать (не проверено):

def beforeUpdate() {
  if (isDirty('email') { //enters only if email was changed. Works only with Grails 1.3.x
  User.withNewSession {
    //Create the new entry
    new User(username:username, email:email).save()
    //Update the old entry with the old email value
    email = getPersistentValue('email')
  }
  }
}
2 голосов
/ 25 августа 2010

Один из вариантов, который я могу придумать, - это реализовать мягкое удаление , а затем сохранить нового пользователя. Я понимаю, что это не совсем то, что вы просите, но я не знаю, как сделать это с помощью одного сохранения. Не идеальный ИМО.

Другим (возможно, лучшим) подходом было бы использование Hibernate Envers для «версии» сущности User и ведения истории изменений. Я не знаю точного статуса Envers с Grails, но похоже, что для него есть плагин . См. Также [пользователь grails] GORM & Envers / Таблицы истории аудита .

...