2011-01-06 73 views
1

一直在努力尋找一個好幾個小時的答案,但到目前爲止還沒有設法提出一個適當的解決方案,所以我希望這裏有人可能會有更多的Grails經驗,並在其中實現自定義關係。Grails - 如何實現不使用id列的外鍵關係?

我的問題是,我有兩個類:

公司
OrderConfig

OrderConfig,包含兩個公司。 1爲收貨人,1爲託運人。我實現了這種關係(見下文),並且一切都看起來很漂亮,我的order_config表包含一個consignee_company_id列和一個shipper_company_id列。

但是,我根本不需要或者完全不需要company_id列。我寧願使用CompanyName作爲標識列。我怎樣才能防止Grails自動添加id列到公司表中,而是使用companyName列作爲主鍵,從而確保我的order_config表將生成包含companyName而不是company_id?

我試圖將公司嵌入到OrderConfig類中,並且與各種其他選項(包括映射)進行了搏鬥,但是我遇到了每個人都遇到的麻煩。

提前致謝!

我迄今爲止代碼:

class OrderConfig { 
static hasMany = [consignee:Company, shipper:Company] 

    String toString() { 
    return "${consignee}" 
} 

    static constraints = { 
     consignee (blank:false, maxSize:10) 
     shipper (blank:false, maxSize:10) 
    } 

    Company consignee 
    Company shipper 
} 




class Company { 
    String toString() { 
    return "${companyName}" 
} 

static constraints = { 
    companyName(blank:false, maxSize:10) 
    companyAddress1(blank:false, maxSize:40) 
    companyAddress2(blank:false, maxSize:40) 
    companyAddress3(blank:false, maxSize:40) 
    companyAddress4(blank:false, maxSize:40) 
    companyZipCode(blank:false, maxSize:36) 
    companyCountry(blank:false, maxSize:36) 
} 

    String companyName 
    String companyAddress1 
    String companyAddress2 
    String companyAddress3 
    String companyAddress4 
    String companyZipCode 
    String companyCountry 
} 

回答

1

你需要看看文檔中的高級GORM配置選項,在第5.5.2.1

有一個例子

class Person { 
    String firstName 
    static hasMany = [addresses:Address] 
    static mapping = { 
     table 'people' 
     firstName column:'First_Name' 
     addresses joinTable:[name:'Person_Addresses', key:'Person_Id', column:'Address_Id'] 
    } 
} 

在那裏你可以看到他們是如何指定密鑰和列名來做這些事情的。

編輯 - 我重讀你的問題:如果你是問如何改變它,公司已分配的ID,你也許能夠做這樣的事例如

static mapping = { 
    id generator:'assigned', column:'column_name',name:'propertyName' 
} 

那裏更多的選擇在這裏:http://www.grails.org/doc/1.3.x/ref/Database%20Mapping/id.html

+0

嗨,謝謝你。這解決了問題的一部分,因爲生成的Order表現在包含對varchar列的引用,並且公司表具有Company_Name列作爲主鍵。但是,Order中的關係列仍標記爲consignee_id和shipper_id。當我嘗試編譯時,它會起作用,但當嘗試添加新的命令時,該應用程序會拋出一個錯誤:無法在空對象上調用方法isInstance()。任何想法如何解決這個問題?我一直在嘗試各種解決方案,但目前爲止還沒有成功。 – Peter 2011-01-10 09:30:51