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

时间:2017-07-19 09:52:26

标签: hibernate grails gorm

我要求每当更新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()

我正在寻找某种方法,它将使整个对象获得数据库中的当前值。

3 个答案:

答案 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