1

私は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 には、多対 1 の関係を定義する際に指定できるオプションがあったことを知っています。主キー以外の列への関係のマッピングを可能にしたのは、property-ref 属性でした。そのようなプロパティはgrailsで利用できますか? もしそうなら、どのように実装できますか?

要約すると、そのテーブルの主キー以外のキーを使用して hasMany リレーションシップをマップする方法を知る必要があります。

4

1 に答える 1

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を一意にすることを忘れないでください

于 2011-11-17T13:13:31.207 に答える