2011-01-06 71 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