2015-03-03 59 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

相關問題