首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的Grails (GORM)实现是什么?

正确的Grails (GORM)实现是什么?
EN

Stack Overflow用户
提问于 2015-03-03 11:29:19
回答 2查看 169关注 0票数 0

作为变更请求的结果,我需要为Grails应用程序实现正确的ORM。

我目前有以下简单的模型和关联:

  • 代理 静态hasMany =费用:费用
  • 费用 静态belongsTo =代理:代理

然而,现在我需要实现的能力,单一的费用是分配给代理商。最后,我得到了以下结果:

潜在的新模式协会

  • 费用 静态hasMany =代理费用:AgentFee
  • 代理 没有联想??
  • AgentFee 静态belongsTo =费用:费用

在我看来,AgentFee应该包含:

  • 对费用的引用
  • 对代理的引用
  • 代理分摊费用的百分比(例如80%)

所以我的问题是。我是否也应该在代理和AgentFees之间建立联系,比如:

  • 费用 静态hasMany =代理费用:AgentFee
  • 代理 静态hasMany =代理费用:AgentFee
  • AgentFee 静态belongsTo =费用:费用静态belongsTo =代理:代理

但是,这只是觉得在AgentFee中的多重AgentFee是错误的。使用GORM实现“费用分割”概念的最佳方法是什么?

提前谢谢你,

约翰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-03 17:30:23

听起来你要把关系转变成多对多。以下是这方面的文档:http://grails.github.io/grails-doc/latest/guide/GORM.html#manyToMany

一个多到多的关系需要一个DB级别的连接表。但是,您很可能不需要一个域作为您的连接表,也就是说,您不需要AgentFee。GORM将知道如何使用连接表。

唯一需要连接表的域对象的情况是,连接表中是否有额外的列,而不是为促进多到多的关系所需的列。在这种情况下,您将为连接表创建一个域,然后创建两个一对多的关系,每个方向一个。

票数 1
EN

Stack Overflow用户

发布于 2015-03-03 18:19:00

回答评论中的问题:

@Michael @John如果您查看底层数据库表,那么您将只看到一个外键从一个表到另一个表,表不交叉引用,除非它是一对一的,所以像我前面描述的那样简化域类不会改变物理数据中的任何变化,而且在代码中更容易维护(您不必使用addTo()removeFrom方法),只需创建一个依赖对象并设置它对当前的引用(您总是只更改一件事情)。

代码语言:javascript
复制
Agent a = new Agent()
Fee fee = new Fee(

此外,如果要检索所有相关对象,可以创建一个属性返回列表,如下

代码语言:javascript
复制
class Fee {
    Agent agent
}
class Agent {
    List<Fee> getFees() { 
        Fee.findAllByAgent(this) 
    }
}

然后把它当作

代码语言:javascript
复制
Agent a = new Agent()
List<Fee> aAgentsFees = a.fees

当然,它是只读的,如果您想创建它们:

代码语言:javascript
复制
Agent agent1 = new Agent()
Fee feeA = new Fee(agent: agent1)
Fee feeB = new Fee()
feeB.agent = agent1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28830706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档