如何强制 gorm 提供数据库对象而不是缓存的实例?



我有一个要求,即每当更新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

相关内容

  • 没有找到相关文章

最新更新