2011-01-17 1 views
0

이것은 다 대 다 관계가있는 첫 번째 프로젝트이며 ORM의 일부 grails 자료를 읽은 후에 Grails가 테이블 생성과 같은 작업을 수행하도록 결정했습니다. 사실, 내 거래였다many-to-many와 매핑 문제

  • 한 사용자가 많은 그룹
  • 을 가지고
  • 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 
    } 
} 

그 후, 내가 grails에서 얻은 것은 3 개의 테이블이었습니다. 사용자 테이블은 괜찮 았지만 다음 2는 내가 예상 한 것이 아니 었습니다. 내가 잘못을했다면 내가 모르거나 내가 어떻게 해결할 수를하지만, 어쨌든 ... 난 아직이야

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

:

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

글쎄, 내가 원하는 것은 이런 일이었다 시도 할 때 또 다른 문제가 발생했습니다. user.addToGroups (새 그룹()). 내 users_groups 테이블은이 등록 정보를 하나씩 member_idx null로 복사하고 다른 등록 정보는 groups_idx null로 복제합니다.

답변

0

당신은지도가 외부 키를 사용하는 구문을 사용하는 belongsTo를 변경하고 테이블에 가입하지 않은 경우 :

static belongsTo = [user: User] 

을하고 백 참조로 user 필드를해야합니다.

+0

그 일을 시도했지만 예외가 발생합니다. 도메인 클래스 [class User]와 [class Group] 사이에 many-to-many 관계로 정의 된 소유자가 없습니다. 예 : static belongsTo = Group – mateusmaso

+0

죄송합니다, 바보 같은 제안입니다. 1-many는 의미가 있지만 many-many는 의미가 없습니다 –

1

어떻게 그룹에서 belongsTo를 제거하고, 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

"many-to-many 관계가 정의 된 소유자가 없습니다"라는 예외가 발생하기 때문에 belongsTo를 제거 할 수 없습니다. – mateusmaso

+0

다른 버전이 나왔습니다. 제 대답을 편집했습니다. – jjczopek

0

는 내가 전에 비슷한 문제를 다했다, 그래서 나는이 작업을 할 수 있습니다 생각 : user.addToGroups의 문제에 대해

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

, 내가 먼저 그룹을 만들 때 소유자를 설정해야한다고 생각합니다. 그런 다음 다른 사용자를 그룹에 추가하십시오.

+0

@Mateus : 이전 버전에서는 실수를 했으므로 답변을 업데이트했습니다. 다시 확인해주세요. –