hibernate属性-ref等效于grails中不存在

时间:2011-11-17 12:02:04

标签: grails gorm self-reference

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

  • id(主键)
  • ldapId(来自传统ldap系统的id)
  • managerLdapId(遗留系统中的经理人关系ID)。

截至目前,我的员工类看起来像这样 -

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

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

问题是我想使用ldapId字段映射我的hasMany关系,但grails将其默认为id字段。我可以将ldapId字段作为主键,但id字段也存在,它是此表的自然主键。

我知道hibernate在定义多对一关系时有一个我们可以指定的选项。 property-ref属性允许将关系映射到主键以外的列。这样的财产是否可用于Grails?如果是这样,它如何实施?

总而言之,我需要知道如何将hasMany关系映射到该表的主键以外的键。

1 个答案:

答案 0 :(得分: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独一无二