2010-02-10 15 views
3

我正在玩Grails,我發現ORM的東西很乏味,因爲我沒有完全理解我在做域類時做了什麼。我希望有人可以把我回到正軌Grails中的多對多鏈接表(GORM)/休眠

考慮以下

測試工作一:許多所使用的硬件上工作很多:一是物理硬件

...這是類似經典的訂單,訂單行,產品的場景在大學DB例子那樣

我創建了以下領域類

class Job 
{ 
    String jobName 
    String jobDescription 
} 

class HardwareOnJob 
{ 
    static hasMany = [ jobs:Job, physicalHardware:PhysicalHardware ] 
    static belongsTo = Job 

    String role 
} 

class PhysicalHardware 
{ 
    String assetName 
    String model 
    String os 
} 

我需要問的是爲什麼Grails會在我的數據庫中爲我創建兩個額外的表格,而不是使用我定義的鏈接實體/域類。例如,Grails會在數據庫中創建hardware_on_job_job和hardware_on_job_physical_hardware。

使用腳手架控制器,我可以輸入一些硬件,輸入一個作業,然後將兩者連接在一起。我的問題是爲什麼它會創建這兩個額外的表,而不是使用我指定的域對象(HardwareOnJob)。

任何幫助/指導將非常感激,因爲堅持看着這個和嘗試新的東西。順便說一句我在grails版本1.2.1

回答

0

當使用一對多或多對多關係時,grails會創建一個包含對象在關係中的ID的連接表。您可以通過告訴grails在一對多關係中使用外鍵來避免使用連接表。據我所知,沒有辦法避免在多對多的關係中使用自動創建的連接表。欲瞭解更多信息見第5.2.1.2和5.2.1.3 this以及this

+0

感謝這幫助引導我朝着正確的方向 – K2J 2010-02-11 09:36:29

0

好了,所以我想出了以下結構玩耍後

class Job 
{ 
    String jobName 
    String jobDescription 

    static mapping = { 
    id column:"jobId" 
    } 

    static hasMany = [hardware:HardwareOnJob] 
} 

class HardwareOnJob 
{ 
    String role 
    Job job 
    PhysicalHardware hardware 


    static mapping = { 
    id column:"hardware_on_job_id" 
    } 

} 

class PhysicalHardware 
{ 
    String assetName 
    String model 
    String os 

    static mapping = { 
    id column:"physical_hardware_id" 
    } 

    static hasMany = [hardwareOnjob:HardwareOnJob] 
} 

戴上這個明智的其他人?已經創建的數據庫結構看起來更加友好,並且只有我期望的三個表。

有興趣聽​​到人們的想法,因爲我來自關係背景。我將對象創建視爲一種從簡單報告的角度給出清晰的數據庫設計的方法。

歡迎評論

+1

我會對於許多應用程序來說,由Grails創建的數據庫結構並不重要,因爲它足夠快並且沒有足夠的數據來需要數據庫調整。我正在開發Grails應用程序,我甚至還沒有看到數據庫結構(使用內存數據庫)。但是,如果您知道您的Grails應用程序會對數據庫造成壓力,那麼您最好從一開始就調整它,稍後更改域類將會很痛苦。 – 2010-02-11 13:21:15

+0

你爲什麼要指定id列?你應該完全刪除id列的映射。 – Blacktiger 2010-02-11 19:32:41

+0

如果你能告訴我爲什麼我應該這樣做,這將有助於我的理解,正如我所說我對grails是新手。許多開發人員完全忽視數據庫,並將其視爲一些愚蠢的存儲層。考慮應用程序何時處於活動狀態並開始積累數據。我想要一個好的和可理解的數據庫設計,我可以輕鬆地編寫報告。鏈接表的原因是我想存儲一個類似量子的項目,並將這些表格鏈接在一起。考慮構成發票的訂單行。 希望大家都有道理。 – K2J 2010-02-24 15:20:50

4

看一看在joinTable關鍵字其中:

定製用於無方向性一個一對多的連接表,許多一對多和原始集合類型

下面是從用戶指南的例子:

class Book { 
    String title 
    static belongsTo = Author 
    static hasMany = [authors:Author] 

    static mapping = { 
     authors joinTable:[name:"mm_author_books", key:'mm_book_id' ] 
    } 
} 
class Author { 
    String name 
    static hasMany = [books:Book] 

    static mapping = { 
     books joinTable:[name:"mm_author_books", key:'mm_author_id'] 
    } 

} 
0

簡單地說,如果孩子只有一個父,那麼在家長,你把

static hasMany = [children: Child] 

和孩子,你把

static belongsTo = [parent: Parent] 

(或者,如果你不想級聯,我認爲剛剛添加「父母親」就足夠了,但這是一個罕見的情況,我猜)

這創建了雙向關係,因爲在子域對象中,您可以訪問父對象t通過屬性,並在一個父對象,你有孩子的集合。

通常情況下,這將在Child中創建一個列,併爲其Parent保留該ID。對許多人來說,情況並非如此,當需要某種鏈接表時(並且GORM可以處理這種情況)。所謂的「一邊倒」的關係(如你在你的第一個例子),也可以創建鏈接表,這是由這個解釋了一下:

http://grails.1312388.n4.nabble.com/Many-to-many-vs-Many-to-one-td1369336.html