2 Stimmen

Beziehung zwischen drei Domänenklassen in GORM

Gibt es eine spezielle Methode, mit Gorm eine Beziehung zwischen drei Domänenklassen wie diese abzubilden?

1 person belongs to N companies with M given roles (one or more roles for a given company)

Vielen Dank im Voraus.

2voto

Ray Tayek Punkte 9433

Betrachten http://www.grails.org/Many-to-Many+Mapping+ohne+Hibernate+XML (ich glaube, sie ist auf dem neuesten Stand).

bewusst sein: http://codedumpblog.blogspot.com/2010/02/grails-many-to-many-with-lists.html

der Code unten funktioniert für mich mit Grails 1.2.0. aber es scheint, wie ich eine Menge von save()'s zu tun hatte. vergessen Sie nicht, die Controller zu machen und setzen scaffold=domain_class

package p

class Company {
    String toString() { "$name"
    }
    static hasMany=[roles:Role]
    static constraints = {
    }
    String name
}

package p

class Role {
    String toString() { "$name"
    }
    static belongsTo=[company:Company]
    static hasMany=[personRoleAssociations:PersonRoleAssociation]
    static constraints = {
    }
    String name
}

package p

class Person {
    String toString() { "$name"
    }
    static hasMany=[personRoleAssociations:PersonRoleAssociation]
    static constraints = {
    }
    String name
}

package p

class PersonRoleAssociation {
    String toString() { "${person.name} as ${role.name}"
    }
        static belongsTo=[person:Person,role:Role]
    static constraints = {
    }
}

import p.*
class BootStrap {

    def init = { servletContext ->
        Person dick=new Person(name:'dick')
        Person jane=new Person(name:'jane')
        dick.save()
        jane.save()
        Company ibm=new Company(name:'ibm')
        ibm.save()
        Role ibmManager=new Role(name:'ibmmanager')
        Role ibmPeon=new Role(name:'ibmpeon')
        ibm.addToRoles(ibmManager)
        ibmManager.save()
        ibm.addToRoles(ibmPeon)
        ibmPeon.save()
        ibm.save()
        Company sun=new Company(name:'sun')
        sun.save()
        Role sunManager=new Role(name:'sunmanager')
        Role sunPeon=new Role(name:'sunpeon')
        sun.addToRoles(sunManager)
        sunManager.save()
        sun.addToRoles(sunPeon)
        sunPeon.save()
        sun.save()
        PersonRoleAssociation dickManager=new PersonRoleAssociation()
        dick.addToPersonRoleAssociations(dickManager)
        ibmManager.addToPersonRoleAssociations(dickManager)
        PersonRoleAssociation dickPeon=new PersonRoleAssociation()
        dick.addToPersonRoleAssociations(dickPeon)
        sunPeon.addToPersonRoleAssociations(dickPeon)
        PersonRoleAssociation janeManager=new PersonRoleAssociation()
        jane.addToPersonRoleAssociations(janeManager)
        sunManager.addToPersonRoleAssociations(janeManager)
        PersonRoleAssociation janePeon=new PersonRoleAssociation()
        jane.addToPersonRoleAssociations(janePeon)
        ibmPeon.addToPersonRoleAssociations(janePeon)
    }
    def destroy = {
    }
}

1voto

Philippe Punkte 6456

Ich würde es versuchen:

class Person {
  String name
  Set<Role> roles
  Set<Company> companies

  public String toString() {
    return name + " roles : " + (roles.collect { it.name }).toString() + " - companies : " + (companies.collect { it.name }).toString()
  }

  static hasMany = [companies:Company, roles:Role]
  static constraints = {
    name (unique:true)
    roles (nullable:true)
  }
}

class Role {
  String name
  String toString() {
    return name + " companies : " + (companies.collect { it.name }).toString() 
  }
  static hasMany = [companies : Company]
  static belongsTo = Company
  static constraints = {
    name (unique:true)
    companies (nullable:false)
  }
}

class Company {
  String name
  String toString() {
    return name + " roles : " + (roles.collect { it.name }).toString()
  }
  static hasMany = [roles : Role]
  static constraints = {
    name (unique:true)
    roles (nullable:true)
  }
}

Habe ich aber nicht getestet... Mich würde interessieren, ob es bei meiner Lösung irgendwelche Probleme gibt und welche das sein können...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X