【问题标题】:Generating a new Domain class with same fields as original Domain class in grails在 grails 中生成与原始域类具有相同字段的新域类
【发布时间】:2018-04-26 09:41:30
【问题描述】:

每当当前表中的字段发生更改时,我都必须将旧数据保存到历史表中。因此,我必须创建一个与原始域类具有相同字段的历史域类。现在,每当原始表中的值更新时,我手动创建历史域类并将旧数据保存到其中。 有没有办法在创建新域类时自动生成具有相同字段的历史域类。

主域类是:

class Unit {

    String name
    String description
    Short bedrooms = 1
    Short bathrooms = 1
    Short kitchens = 1
    Short balconies = 0
    Short floor = 1
    Double area = 0.0D
    Date expDate
    Date lastUpdated

    static hasMany = [tenants:Tenant]
    static belongsTo = [property: Property]
}

History Domain 类应该是这样的:

class UnitHistory {

    String name
    String description
    Short bedrooms = 1
    Short bathrooms = 1
    Short kitchens = 1
    Short balconies = 0
    Short floor = 1
    Double area = 0.0D
    Date expDate
    Date lastUpdated

    static hasMany = [tenants:Tenant]
    static belongsTo = [property: Property]
}

【问题讨论】:

  • 如果您的要求不是 100% 固定的,您可能需要考虑使用审计日志记录概念。这将为您节省大量开销,尤其是对于复杂的对象(例如 hasMany 租户......它们是否也都被复制了?)。一个现有的插件在这里:plugins.grails.org/plugin/robertoschwald/audit-logging 虽然当然还有其他插件。
  • 您真的需要 2 个单独的域,还是可以使用同一个域并对记录进行版本化,以便最新版本始终代表当前状态,而所有以前的版本都代表历史? (当然是一个单独的版本,然后是内置的乐观锁定 version 属性)
  • 是的,hasMany 也被复制了。根据要求,我必须创建另一个具有相同字段且后缀为“历史”的表。 @JeffScottBrown

标签: java grails grails-orm


【解决方案1】:

也许您可以将beforeInsertbeforeUpdate 方法添加到您的Unit 域,如下所示:

class Unit {

    String name
    String description
    Short bedrooms = 1
    Short bathrooms = 1
    Short kitchens = 1
    Short balconies = 0
    Short floor = 1
    Double area = 0.0D
    Date expDate
    Date lastUpdated

    def beforeInsert() {
        addHistory()
    }

    def beforeUpdate() {
        addHistory()
    }

    def addHistory(){
        new UnitHistory( this.properties ).save( failOnError: true )
    }
}

【讨论】:

  • 如何在创建 Unit 时自动生成 UnitHistory。当 Unit 中的任何字段发生变化时,它也应该反映在 UnitHistory 模式中。
  • 以上应该可以实现
【解决方案2】:

我需要更多地了解实际要求才能确定最好的做法是什么,但要考虑的一种可能的解决方案是使用事件侦听器,该事件侦听器会在每次插入和/或更新主类。 https://github.com/jeffbrown/gorm-events-demo/blob/261f25652e5fead8563ed83f7903e52dfb37fb40/src/main/groovy/gorm/events/demo/listener/AuditListener.groovy#L22 是一个事件监听器的例子。您可以创建一个历史类的新实例,复制相关内容,然后持久化该新创建的历史实例,而不是像在该示例中看到的那样更新实例。

有关 GORM 事件的更多信息,请参阅https://async.grails.org/latest/guide/index.html#gormEvents

希望对你有帮助。

【讨论】:

  • 有没有办法在创建域类时自动生成具有相同字段的历史类?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2012-06-03
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多