什么是正确的 Grails ORM (GORM) 实现?
What is the correct Grails ORM (GORM) implementation to use?
由于变更请求,我需要为我的 Grails 应用程序实施正确的 ORM。
我目前有以下简单的模型和关联:
代理
static hasMany = [fees:Fee]
费用
static belongsTo = [agent:Agent]
但是,现在我需要实现在代理之间分配单一费用的能力。我最终得到以下结果:
潜在的新模型协会
费用
static hasMany = [agentfees:AgentFee]
代理
no associations ??
代理费
static belongsTo = [fee:Fee]
在我看来,AgentFee 将包含:
- 对费用的引用
- 对代理的引用
- 代理人的费用分成百分比(例如 80%)
所以我的问题是。我是否还应该在 Agents 和 AgentFees 之间建立关联,例如:
费用
static hasMany = [agentfees:AgentFee]
代理
static hasMany = [agentfees:AgentFee]
代理费
static belongsTo = [fee:Fee]
static belongsTo = [agent:Agent]
但是AgentFee中的多个belongsTo感觉不对。使用 GORM 实现 "Fee Splits" 概念的最佳方法是什么?
提前致谢,
约翰
听起来您正在将关系更改为多对多关系。这是相关文档:http://grails.github.io/grails-doc/latest/guide/GORM.html#manyToMany
多对多关系需要在数据库级别加入 table。但是,您很可能不需要域来加入 table,即您不需要 AgentFee。 GORM 将知道使用连接 table。
您唯一需要域对象来加入 table 的情况是加入 table 除了促进多对多关系所需的列之外还有其他列。在这种情况下,您将为加入 table 创建一个域,然后创建两个一对多关系,每个方向一个。
回答评论中的问题:
@Michael @John 如果你查看基础数据库 tables 那么你只会看到从一个 table 到另一个的外键,tables 不会交叉引用,除非它是一对一的,所以像我之前描述的那样简化域 类 不会改变物理数据,并且更容易在代码中维护(您不必使用 addTo()
和 removeFrom
方法),你只需创建一个依赖对象并将它的引用设置为当前(你总是只改变一件事)
Agent a = new Agent()
Fee fee = new Fee(
此外,如果您想检索所有相关对象,您可以创建一个 属性 返回列表,例如
class Fee {
Agent agent
}
class Agent {
List<Fee> getFees() {
Fee.findAllByAgent(this)
}
}
并像
一样使用它
Agent a = new Agent()
List<Fee> aAgentsFees = a.fees
当然是只读的,如果你想创建它们:
Agent agent1 = new Agent()
Fee feeA = new Fee(agent: agent1)
Fee feeB = new Fee()
feeB.agent = agent1
由于变更请求,我需要为我的 Grails 应用程序实施正确的 ORM。
我目前有以下简单的模型和关联:
代理
static hasMany = [fees:Fee]
费用
static belongsTo = [agent:Agent]
但是,现在我需要实现在代理之间分配单一费用的能力。我最终得到以下结果:
潜在的新模型协会
费用
static hasMany = [agentfees:AgentFee]
代理
no associations ??
代理费
static belongsTo = [fee:Fee]
在我看来,AgentFee 将包含:
- 对费用的引用
- 对代理的引用
- 代理人的费用分成百分比(例如 80%)
所以我的问题是。我是否还应该在 Agents 和 AgentFees 之间建立关联,例如:
费用
static hasMany = [agentfees:AgentFee]
代理
static hasMany = [agentfees:AgentFee]
代理费
static belongsTo = [fee:Fee] static belongsTo = [agent:Agent]
但是AgentFee中的多个belongsTo感觉不对。使用 GORM 实现 "Fee Splits" 概念的最佳方法是什么?
提前致谢,
约翰
听起来您正在将关系更改为多对多关系。这是相关文档:http://grails.github.io/grails-doc/latest/guide/GORM.html#manyToMany
多对多关系需要在数据库级别加入 table。但是,您很可能不需要域来加入 table,即您不需要 AgentFee。 GORM 将知道使用连接 table。
您唯一需要域对象来加入 table 的情况是加入 table 除了促进多对多关系所需的列之外还有其他列。在这种情况下,您将为加入 table 创建一个域,然后创建两个一对多关系,每个方向一个。
回答评论中的问题:
@Michael @John 如果你查看基础数据库 tables 那么你只会看到从一个 table 到另一个的外键,tables 不会交叉引用,除非它是一对一的,所以像我之前描述的那样简化域 类 不会改变物理数据,并且更容易在代码中维护(您不必使用 addTo()
和 removeFrom
方法),你只需创建一个依赖对象并将它的引用设置为当前(你总是只改变一件事)
Agent a = new Agent()
Fee fee = new Fee(
此外,如果您想检索所有相关对象,您可以创建一个 属性 返回列表,例如
class Fee {
Agent agent
}
class Agent {
List<Fee> getFees() {
Fee.findAllByAgent(this)
}
}
并像
一样使用它Agent a = new Agent()
List<Fee> aAgentsFees = a.fees
当然是只读的,如果你想创建它们:
Agent agent1 = new Agent()
Fee feeA = new Fee(agent: agent1)
Fee feeB = new Fee()
feeB.agent = agent1