Проблема со многими ко многим и отображением - PullRequest
0 голосов
/ 17 января 2011

Это мой первый проект со связями многие ко многим, и после прочтения некоторых материалов Gram в ORM, я решил позволить grails делать всю работу за меня, например, создавать таблицы.На самом деле моя сделка заключалась в следующем:

  • 1 У пользователя много групп
  • 1 Группа принадлежит пользователю и имеет много пользователей (кроме владельца)

Вот мои уроки:

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
    }
}

После этого я получил 3 таблицы из Грааля.Таблица users была в порядке, но следующие 2 оказались не такими, как я ожидал.

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

Ну, я хотел что-то вроде этого:

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

Я не знаю, сделал ли я что-то не так или как я могу это исправить, но в любом случае ... У меня все еще возникает другая проблема, когда я пытаюсь сделать user.addToGroups (new Group ()) ,Моя таблица users_groups дублирует этот регистр, один с нулевым members_idx, а другой регистр с null groups_idx.

Ответы [ 3 ]

1 голос
/ 17 января 2011

Как насчет удаления принадлежащего из группы и выхода из 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
    }
}

РЕДАКТИРОВАТЬ Я думаю, что вы должны создать класс домена, который фактически будет объединять группы и пользователей.Я думаю, вы должны попробовать это:

    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
   }

}

Это создаст другую таблицу, которая фактически объединяет группы и пользователей.

0 голосов
/ 18 января 2011

У меня уже была похожая проблема, поэтому я думаю, что это может сработать:

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
    }
}

По поводу проблемы с user.addToGroups, я думаю, что вы должны установить владельца при создании группы в первую очередь.Затем добавьте других пользователей в группу.

0 голосов
/ 17 января 2011

Если вы измените принадлежность на использование синтаксиса карты, он будет использовать внешний ключ, а не таблицу соединения:

static belongsTo = [user: User]

и у вас будет поле user в качестве обратной ссылки.

...