当我更改域对象而不是更新数据库记录时,我想存档旧记录并创建一个新记录。我想强制GORM自动执行此操作。
例如,如果我有这个域类:
class User {
String username
String email
Boolean active
}
然后我想
user.email = email
user.save()
将用户的活动标志设置为false,保留旧电子邮件的记录。将插入新电子邮件地址和active = true的新记录。
这是一种常见的模式吗?在域类中是否容易做到透明地发生?
答案 0 :(得分:2)
我能想到的一个选择是实现soft delete,然后坚持新用户。我意识到这不是你要求的,但我不知道如何用一次保存来做到这一点。不理想的IMO。
另一种(可能更好的)方法是使用Hibernate Envers来“版本化”User
实体并保留更改历史记录。我不知道Envers与Grails的确切状态,但看起来它有一个plugin。另请参阅[grails-user] GORM & Envers / Audit History Tables。
答案 1 :(得分:2)
您可以将GORM事件beforeUpdate
用于用户域类(请参阅文档here和here),以下内容应该有效(未经测试):
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')
}
}
}