【问题标题】:hibernate property-ref equivalent not present in grailsgrails中不存在hibernate property-ref等价物
【发布时间】:2011-12-31 07:01:29
【问题描述】:

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

  • 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 字段映射我的 hasMany 关系,但 grails 将其默认为 id 字段。我本可以将 ldapId 字段作为主键,但 id 字段也存在,它是该表的自然主键。

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

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

【问题讨论】:

    标签: grails grails-orm self-reference


    【解决方案1】:

    我想是的:

    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 独一无二

    【讨论】:

    • 感谢您的回复,但这并不能解决我的问题。我需要 id 字段以及 ldapId 字段。它们都存在于我的数据库中。只是我需要 id 字段作为主键, ldapId 字段作为键,用作自连接的外键。我不希望 ldapId 成为我表的主键。这就是为什么我在总结中提到我需要某种方式来使用我的 hasMany 关系的主键以外的字段。我认为一种选择是将 Grails 与 hbm.xml 映射文件一起使用,并像在 java 中那样映射它。还有其他人吗?
    • 我知道这个很老的问题,但你有没有找到更好的解决方案?我正面临这个问题,我是 Grails 的新手......
    猜你喜欢
    • 2014-07-23
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2021-03-17
    相关资源
    最近更新 更多