【问题标题】:Grails 2.5.x GORM persistent artificial propertiesGrails 2.5.x GORM 持久人工属性
【发布时间】:2016-03-18 01:25:46
【问题描述】:

是否可以在 Grails 2.5.x GORM 中保留人工属性?

也可以使用 Hibernate 4 注释/设置。

例如,我希望能够将 DomainObjectC 持久化到具有 3 列(id、do_b_id、do_a_id)的 domain_object_c 表中,以非规范化 do_a_id。

如何让 GORM 创建并填充 domain_object_c.do_a_id 列?:

class DomainObjectA {}

class DomainObjectB {
    DomainObjectA doA
}

class DomainObjectC {
    DomainObjectB doB
    Long getDoAId() {doB?.doAId}
}

【问题讨论】:

  • 我不明白你在问什么。如果您想要持久化某些内容,为什么不在类中包含该字段?
  • 因为DomainObjectC#doAId 应该始终与DomainObjectC#doB?.doAId 相同。我的代码结构以一种简单的方式强制执行此操作,并且不使用任何额外的内存。
  • DomainObjectB.doA 复制到DomainObjectC 的目的是什么?可以做到,但你打算如何保持副本同步?
  • 目的是数据库非规范化,加快查询速度。您只需通过 GORM 更新数据库即可保持副本同步。这不会将DomainObjectB.doA 复制到DomainObjectC。它只有一个包装方法来访问doAid。包装器的目的是为 GORM 提供一种简单的方法来将正确的非规范化数据保存到 domain_object_c 表中。我只是不知道正确的 GORM 或 Hibernate 配置/注释来使该只读属性持久化/

标签: hibernate grails grails-orm hibernate-4.x grails-2.5


【解决方案1】:

你可以这样做:

class DomainObjectB {
    DomainObjectA doA

    //To keep in sync the data of DoaminObjectC table
    def beforeUpdate(){
        if (this.isDirty('doA')){
            DomainObjectC.findAllByDoB(this)*.setDob(this).save()
        }
    }
}

class DomainObjectC {
    DomainObjectB doB
    Long doAId

    public void setDoB(DomainObjectB doB){
        this.doB = doB
        doAId = doB?.doAId
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多