GORM-获取域类属性的原始DB值

时间:2019-05-22 16:01:02

标签: mongodb grails gorm getter

我正在Grails 3网络应用程序中使用MongoDB的GORM来管理数据库的读/写。

我有以下2个域类:

class Company {
  String id
}

class Team {
  String id
  Company company
}

对于团队来说,他们的公司以String的形式保存在数据库中,而使用GORM,我可以简单地使用team.company来获取Company域类的实例。

但是,我需要覆盖company的getter,并且需要公司ID(存储在数据库中)的原始值,而GORM不会妨碍并发挥其魔力。 有没有办法获取原始String值?

欢迎任何帮助!预先感谢


更新(5月27日)

调查@TaiwaneseDavidCheng的建议,我将代码更新为

class Company {
  String id
}

class Team {
  String id
  Company company
  String companyId

  static mapping = {
    company       attr: "company"    // optional
    companyId     attr: "company", insertable: false, updateable: false
  }
}

请注意,我正在为MongoDB使用GORM,(引用manualtries to be as compatible as possible with GORM for Hibernate,但需要稍有不同的实现。

但是我(通过试验和错误)发现,GORM for MongoDB不支持类似的解决方案,因为一次只能将一个属性映射到MongoDB文档属性。
特别是按字母顺序的最后一个属性获胜,例如在我的示例中为companyId


我想出了一种使整个过程正常运行的方法,我在下面发布自己的答案。

2 个答案:

答案 0 :(得分:1)

在域类中提供了不可插入的不可更新列“ companyId”

class Company {
  String id
}

class Team {
  String id
  Company company
  Long companyId
  static mapping = {
    company               column:"companyId"
    companyId               column:"companyId",insertable: false,updateable: false
  }
}

答案 1 :(得分:0)

(在我上面的问题后面进行修改)

我定义了一个自定义映射,并且还通过为团队公司定义了自定义getter和setter来使用Grails transients

class Company {
  String id
}

class Team {
  String id
  Company company
  String companyId

  static mapping = {
    companyId     attr: "company"    // match against MongoDB property
  }

  static transients = [ 'company' ]  // non-persistent property

  Company getCompany() {
    return Company.get(companyId)
  }
  void setCompany(Company company) {
    companyId = company.id
  }

}