2015-03-03 70 views
0

作为更改请求的结果,我需要为我的Grails应用程序实现正确的ORM。什么是正确的Grails ORM(GORM)实现使用?

我公司目前有以下简单的模型和协会:

  • 代理

    static hasMany = [fees:Fee] 
    
  • static belongsTo = [agent:Agent] 
    

不过,现在我需要实现的能力为一首歌曲费用将在代理商中分摊。我结束了以下内容:

潜在的新车型协会

  • static hasMany = [agentfees:AgentFee] 
    
  • 代理

    no associations ?? 
    
  • AgentFee

    static belongsTo = [fee:Fee] 
    

在我心中的AgentFee将包含:

  • 一定费用
  • 给代理
  • 代理的%的手续费的分割基准的基准(如80%)

所以我的问题是。我也应该有即像代理和AgentFees之间的关联:

  • static hasMany = [agentfees:AgentFee] 
    
  • 代理

    static hasMany = [agentfees:AgentFee] 
    
  • AgentFee

    static belongsTo = [fee:Fee] 
    static belongsTo = [agent:Agent] 
    

但是这只是感觉与AgentFee中的多个belongsTo错误。使用GORM实施“费用拆分”概念的最佳方式是什么?

由于提前,

约翰

+2

你试过了'static belongsTo = [fee:Fee,agent:agent]'? – 2015-03-03 12:31:47

+0

谢谢你。我没有尝试过,但我的问题更多 - 是我的建模方式正确的开始?我的“费用拆分”方法是否正确? – 2015-03-03 14:26:16

+1

对我来说看起来不错,但是,根据我的经验 - 如果您不使用脚手架控制器(大多数时候您不使用),也不使用自动创建数据库模式(也不应该),然后使用belongsTo和有许多属性会带来更多的痛苦而不是收益 - 个人而言,我只将一个引用作为常规字段放入域类而不是belongsTo,并且如果不使用hasMany,则跳过hasMany – 2015-03-03 14:37:32

回答

1

这听起来像你正在改变到许多一对多的关系。以下是相关文档:http://grails.github.io/grails-doc/latest/guide/GORM.html#manyToMany

多对多关系需要在数据库级别的连接表。但是,您很可能不需要加入表的域,即不需要AgentFee。 GORM将知道使用连接表。

您唯一需要连接表的域对象的时间是如果连接表具有超出促进多对多关系所需的额外列。在这种情况下,您将为连接表创建一个域,然后创建两个一对多关系,每个关系一个。

+0

感谢你。回覆。 - 在多对多的情况下,除了当连接表具有超出促进多对多关系所需的列之外的其他列时,不需要用于多对多连接表的域,在这种情况下,我需要知道代理有权收取费用。所以这会让我相信我需要你的第二个例子,它是“加入表的一个域,然后创建两个一对多关系,每个方向一个。”即在我原来的问题中,上面列出的内容在你看来是正确的? – 2015-03-03 18:20:30

+0

@JohnR是的,它看起来是正确的。我看了一些代码,我有一个与其他多列列表的连接表,就像你的一样(即两个belongsTo在加入的域) – Michael 2015-03-03 18:53:38

+0

非常感谢,它只是觉得有点“奇怪”,但很高兴得到一些澄清 – 2015-03-03 19:53:24

0

从评论回答问题:

@迈克尔@约翰,如果你看一下底层数据库表,然后你会看到从一个表到另一个只有一个外键,表不交叉引用,除非它是一个对因此,像我之前描述的那样简化域类不会改变物理数据,并且它更容易在代码中维护(您不必使用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 
+0

我没有看到使用hasMany的任何优势,我所看到的都是缺点。首先,使用hasMany是处理多边关系的标准GORM方法,因此未来的代码维护者将不得不弄清楚代码如何工作以及为什么要这样做。此外,您的方式不会让您利用批量设置操作(removeAll和retainAll)来管理关系多方的添加/更新/删除操作。 – Michael 2015-03-03 19:01:44

+0

感谢您的努力,也非常感谢 - 但只是补充,从文档中注意这一点:“默认的级联行为是级联保存和更新,但不会删除,除非指定了belongsTo” – 2015-03-03 19:51:55

+0

@Michael我并不是说我是对的,而你的错,我只是说我的4年Grails经验带来了什么:)早在2.0.0版本之前,单元测试涉及hasMany关系也存在问题 - 还有同事们 - 我们注意到如果你想连接两个对象,你必须在belongsTo方面设置关系,并在另一端使用addTo,这可能会遗忘其中的一个 - 在5或6个grails项目之后停止使用hasMany/belongsTo,我也对待动态发现者,如果他们是私人的,那是什么更好4 me – 2015-03-03 21:57:07

相关问题