我要求每当更新Data域类时,旧值应以JSON格式存储到数据库表中,以便在此之后的任何时间进行审计。
这里我有三个班级:
数据 - SUPER CLASS
A - SUB CLASS(还有其他子类)
历史记录 - 需要保留旧数据的表
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 = {
}
}
在Data Domain类中的beforeUpdate()方法将当前值读取为json而不是旧值(数据库中存在的值)
def jsonData =(Data.get(this)as JSON).toString()
我正在寻找某种方法,它将使整个对象获得数据库中的当前值。
答案 0 :(得分:1)
您可以在加载的对象上使用方法refresh()
。与this.refresh()
一样。
或者您可以使用新的hibernate会话进行加载:
def jsonData
withNewSession {
jsonData = (Data.get(this) as JSON).toString()
}
答案 1 :(得分:1)
如果您确实需要自己执行此操作,则可以轻松地手动访问脏/持久属性。例如,
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()
}
答案 2 :(得分:0)
这并没有直接回答你的问题,但你可能会考虑为你提供此功能的插件,而不是重新发明轮子(虽然不是JSON,但是以允许你审核旧数据的方式,谁和何时数据已更改)。例如,请参阅http://plugins.grails.org/plugin/robertoschwald/audit-logging