域类可以配置为插入新记录而不是在保存时更新吗?

时间:2010-08-24 22:01:55

标签: hibernate grails gorm

当我更改域对象而不是更新数据库记录时,我想存档旧记录并创建一个新记录。我想强制GORM自动执行此操作。

例如,如果我有这个域类:

class User {
    String username
    String email
    Boolean active
}

然后我想

user.email = email
user.save()

将用户的活动标志设置为false,保留旧电子邮件的记录。将插入新电子邮件地址和active = true的新记录。

这是一种常见的模式吗?在域类中是否容易做到透明地发生?

2 个答案:

答案 0 :(得分:2)

我能想到的一个选择是实现soft delete,然后坚持新用户。我意识到这不是你要求的,但我不知道如何用一次保存来做到这一点。不理想的IMO。

另一种(可能更好的)方法是使用Hibernate Envers来“版本化”User实体并保留更改历史记录。我不知道Envers与Grails的确切状态,但看起来它有一个plugin。另请参阅[grails-user] GORM & Envers / Audit History Tables

答案 1 :(得分:2)

您可以将GORM事件beforeUpdate用于用户域类(请参阅文档herehere),以下内容应该有效(未经测试):

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')
  }
  }
}