2011-01-17 16 views
0

Dies ist mein erstes Projekt mit vielen-zu-vielen-Beziehungen und nachdem ich einige Grails-Sachen von ORM gelesen hatte, beschloss ich, dass Grails die Arbeit für mich erledigen, wie das Erstellen der Tabellen. Eigentlich mein Deal war:Problem mit Viele-zu-Viele und Kartierung

  • 1 Benutzer viele Gruppen hat
  • 1 gehört einer Gruppe zu einer User und viele Nutzer hat (außer dem Eigentümer)

Hier sind meine Klassen:

class User { 
    String name 
    List groups 

    static hasMany = [groups : Group] 

    static mapping = { 
     table 'users' 
     version false 
    } 
} 

class Group { 
    String name 
    List members 

    static belongsTo = User 
    static hasMany = [members : User] 

    static mapping = { 
     table 'groups' 
     version false 
    } 
} 

Danach, was ich von Grails bekam, war 3 Tische. Die Benutzer Tisch war in Ordnung, aber die nächsten 2 war nicht das, was ich erwartet hatte.

table **groups** | id | name 
table **users_groups** | group_id | user_id | members_idx | groups_idx 

Nun, was ich wollte, war so etwas wie diese:

table **groups** | id | name | user_id 
table **users_groups** | group_id | members_idx | groups_idx 

Ich weiß nicht, ob ich etwas falsch gemacht habe oder wie kann ich das Problem beheben, aber trotzdem ... Ich bin immer noch ein anderes Problem zu bekommen, wenn ich versuche, user.addToGroups (neue Group()) zu tun. Meine users_groups Tabelle dupliziert dieses Register, eines mit dem Members_idx null, und das andere Register mit dem groups_idx null.

Antwort

0

Wenn Sie die belongsTo ändern Karte verwenden Syntax es wird ein Fremdschlüssel verwenden und eine Tabelle nicht beitreten:

static belongsTo = [user: User] 

und Sie werden ein user Feld als Rückbezug haben.

+0

Ich erinnere mich, dass ich versuchte, das zu tun, aber es löst eine Ausnahme aus: Kein Besitzer definiert zwischen Domänenklassen [Klasse Benutzer] und [Klassengruppe] in einer Viele-zu-viele-Beziehung. Beispiel: static oigsTo = Gruppe – mateusmaso

+0

Sorry, dummer Vorschlag. Das macht Sinn für ein 1-many, aber nicht für viele-viele –

1

Wie wäre es belongsTo aus der Gruppe zu entfernen und lassen hasMany:

class User { 
    String name 
    List groups 

    static hasMany = [groups : Group] 

    static mapping = { 
     table 'users' 
     version false 
    } 
} 

class Group { 
    String name 
    List members 

    static hasMany = [members : User] 

    static mapping = { 
     table 'groups' 
     version false 
    } 
} 

EDIT Ich glaube, Sie haben einen Domain-Klasse zu machen, die Gruppen und Benutzer tatsächlich beitreten werden. Ich denke, Sie sollten dies versuchen:

class User { 
     String name 

     static hasMany = [groups : UsersGroups] 

     static mapping = { 
      table 'users' 
      version false 
     } 
    } 

class Group { 
    String name 

    static hasMany = [members : UsersGroups] 

    static mapping = { 
     table 'groups' 
     version false 
    } 
} 

class UsersGroups { 

    static belongsTo = [group: Group, user: User] 
    static mapping = { 
     version false 
    } 

} 

Es wird eine andere Tabelle erstellen, die tatsächlich Gruppen und Benutzer verbindet.

+0

Ich kann das angleTo nicht entfernen, weil es eine Ausnahme verursacht: "Kein Besitzer zwischen vielen-zu-viele Beziehung definiert". – mateusmaso

+0

Ich habe eine andere Version gefunden - ich habe meine Antwort bearbeitet. – jjczopek

0

Ich habe vor ein ähnliches Problem getan, so denke ich, dies funktionieren kann:

class User { 
    String name 
    hasMany = [groups : Group] 

    static mapping = { 
     table 'users' 
     version false 
    } 
} 

class Group { 
    String name 

    static belongsTo = [owner : User] 
    static hasMany = [members : User] 

    static mapping = { 
     table 'groups' 
     version false 
    } 
} 

Über das Problem mit user.addToGroups, glaube ich, dass Sie den Eigentümer gesetzt sollte, wenn zunächst die Gruppe zu schaffen. Fügen Sie dann andere Benutzer zur Gruppe hinzu.

+0

@Mateus: In der vorherigen Version habe ich einen Fehler gemacht, also habe ich die Antwort aktualisiert. Bitte schau es dir nochmal an. –