我有一个要求,即每当更新Data
域类时,旧值都应以JSON格式存储到数据库表中,以便之后可以随时对其进行审核。
在这里,我有三节课:
Data
- 超级舱User
- 子类(还有其他子类(History
- 需要保存旧数据的表
class Data implements Serializable {
Date dateCreated
Date lastUpdated
User createdBy
User updatedBy
Status status
static mapping = { tablePerHierarchy false }
def beforeUpdate() {
def jsonData = (Data.get(this) as JSON).toString()
new History(data:jsonData, domain: this.class.toString(), refid: this.id).save()
}
}
class User extends Data {
String name
static constraints = {}
}
class History {
String data
Date dateCreated
String domain
Date lastUpdated
long refid
static constraints = {}
}
域类beforeUpdate()
Data
方法是将当前值作为 JSON 而不是旧值(数据库中存在(获取:
def jsonData = (Data.get(this) as JSON).toString()
我正在寻找某种方法,该方法将获取具有数据库中当前值的整个对象。
可以在加载的对象上使用方法refresh()
。喜欢this.refresh()
.
或者,您可以使用新的休眠会话进行加载:
def jsonData
withNewSession {
jsonData = (Data.get(this) as JSON).toString()
}
如果您确实需要自己执行此操作,则可以轻松地手动访问脏/持久属性。 例如,
def beforeUpdate() {
println("Dirty properties: ${listDirtyPropertyNames()}")
Map map = [:]
listDirtyPropertyNames().each { name ->
println("Dirty property: ${name} ---- old value: ${getPersistentValue(name)} ----- new Value: " + this."${name}")
map.put(name, getPersistentValue(name))
}
def jsonData = (map as JSON).toString()
}
这并不能直接回答您的问题,但您可以考虑为您提供此功能的插件,而不是重新发明轮子(尽管不是在 JSON 中,而是以允许您审核旧数据、谁以及何时更改数据的方式(。 例如,请参阅 http://plugins.grails.org/plugin/robertoschwald/audit-logging