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

What is the correct Grails ORM (GORM) implementation to use?

由于变更请求,我需要为我的 Grails 应用程序实施正确的 ORM。

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

但是,现在我需要实现在代理之间分配单一费用的能力。我最终得到以下结果:

潜在的新模型协会

在我看来,AgentFee 将包含:

所以我的问题是。我是否还应该在 Agents 和 AgentFees 之间建立关联,例如:

但是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