我正在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,(引用manual)tries to be as compatible as possible with GORM for Hibernate
,但需要稍有不同的实现。
但是我(通过试验和错误)发现,GORM for MongoDB不支持类似的解决方案,因为一次只能将一个属性映射到MongoDB文档属性。
特别是按字母顺序的最后一个属性获胜,例如在我的示例中为companyId
。
我想出了一种使整个过程正常运行的方法,我在下面发布自己的答案。
答案 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
}
}