2011-11-17 23 views
1

我是grails的新手,目前正试图映射Employee类。每个员工可能有也可能没有经理。另外,每位员工(如果他是经理)都会有一份下属名单。使用hasMany和belongsTo静态数组映射到这个范围相对容易。但是,我的例子有一个额外的复杂性。我有我的员工3个列:hibernate属性-ref等价不存在于grails中

  • ID(主键)
  • ldapId(从传统LDAP系统的ID)
  • managerLdapId(从旧系统管理者关系ID)。

我Employee类截至目前看起来是这样的 -

class Employee { 
    String firstname 
    String lastname 
    String email 
    String ldapId 
    Employee manager 

    static hasMany = [subordinates: Employee] 
    static belongsTo = [manager: Employee] 
} 

的问题是,我要地图使用ldapId领域,但Grails的则默认为id字段我的hasMany关系。我可以将ldapId字段作为主键,但id字段也存在,它是此表的自然主键。

我知道hibernate有一个选项,我们可以在定义多对一关系时指定。它是允许将关系映射到主键以外的列的property-ref属性。这样的属性可用于Grails吗?如果是这样,它如何实施?总结一下,我需要知道如何映射hasMany关系与表中主关键字以外的其他关键字。

回答

0

我是这样认为的:

class Employee { 
    String firstname 
    String lastname 
    String email 
    String ldapId 
    Employee manager 

    static hasMany = [subordinates: Employee] 
    static belongsTo = [manager: Employee] 

    static transients = ['getId', 'setId'] 

    def getId() { ldapId } 
    def setId(id) { this.ldapId = id } 

    static mapping = { 
    table 'Employee' 
    id generator:'assigned', name:'ldapId', type:'string' 
    ... 
    } 
} 

不要忘了让ldapId独特

+0

感谢回答,但这并不遗憾的是解决我的问题。我需要id字段以及ldapId字段。他们都在我的数据库中。这只是我需要id字段作为主键,而ldapId字段作为用作自连接外键的键。我不希望ldapId成为我的表的主键。这就是为什么我总结提到我需要一些方法来使用除主键以外的字段来实现hasMany关系。我认为有一个选择是将Grails与hbm.xml映射文件结合使用,并将其映射为java中的映射文件。任何其他? – maverick13

+0

我知道很古老的问题,但你有没有找到更好的解决方案?我正面临着这个问题,我是新来的Grails ...... – ETL