2011-08-04 1 views
1

다 - 대 - 다 관계를 조정하기 위해 grails에서 연관 테이블을 만드는 것에 대한 질문이 있습니다. 설정은 다음과 같습니다. 1. 도메인 A (클라이언트 프로파일)는 많은 도메인 B (친구) 을 가질 수 있습니다. 2. 각 도메인 B (친구)는 많은 도메인 A (클라이언트 프로파일) 을 가질 수 있습니다. 3.이를 해결하려면 다음을 수행해야합니다. 각 테이블에서 FK가있는 연관 테이블 (또는 도메인)을 만듭니다.Grails 도메인 생성 연관 테이블

class DomainA{ 
    String id 
String firstName 
String lastName 
    static hasMany = [domainB: DomainB] 
    static mapping = { 
    cache true 
    id generator: 'assigned' 

    columns { 
     firstName type:'text' 
     lastName type:'text' 
     alumConnections column: 'domaina_id', joinTable: 'a_b' 
    } 

} 
static constraints = { 
    firstName (nullable:true) 
    lastName (nullable:true) 
} 

    } 

DOMAINB 코드 :

class DomainB{ 
String id 
String firstName 
String lastName 

    static hasMany = [domainA:DomainA] 
static belongsTo = DomainA 
static mapping = { 
    cache true 
    id generator: 'assigned'   

      columns {     
     firstName  type:'text' 
     lastName  type:'text' 
     domainA column: 'domainb_id', joinTable: 'a_b' 
    } 
} 
static constraints = { 
    firstName  (nullable:true) 
    lastName  (nullable:true) 

} 
    } 

도메인 A_B 코드 :

class AB{ 


Date dateCreated 
Date lastUpdated 
long version 

    } 
이 도메인은 도메인 C (client_friend는) 다음

내가 지금까지 가지고있는 코드 이름을 지정할 수 있습니다

이 코드를 실행하면 작동하는 것 같습니다. MySQL을 사용하는 테이블이 생성되고, FK가 제자리에있는 것처럼 보입니다. DomainB 클래스에 데이터를 입력하면 데이터가 입력되고 DomainA와 DomainB의 PK가 모두 A_B에 삽입됩니다. 그러나 A_B에서 값을 삭제하려고하면 문제가 발생합니다. 나는이 같은 시도했다 :

 AB results =AB.findByAIdAndBId('jIi-hRi4cI','2BYvuA2X14') 

을하지만, 오류 얻을 : InvalidPropertyException : 이름을 찾을 수 없습니다 속성을 [A_ID] 클래스 [클래스는 mgr.AB]

내 질문은 이것이다 : 첫째,이 나는 이것을 올바르게 설정했다? 둘째로, 그렇다면 PK가 DomainA와 DomainB의 합성물로 구성된 AB 테이블을 어떻게 쿼리합니까?

도움 주셔서 감사합니다.

제이슨

답변

1

귀하의 복합 클래스는 완전히 정확하지 않습니다. 이 예를보고 그에 맞게 조정하십시오. 이것은 내 모든 복합 도메인을 수행하는 방법입니다.

일단 소유하고 나면 belongsTo 및 hasMany 연관은 필요 없습니다. 그러나 해당 도메인의 데이터에 액세스하려면 다음과 같은 방법을 제공 할 수 있습니다

class User { 

    // typical domain junk 

    Set<Role> getAuthorities() { 
    UserRole.findAllByUser(this).collect { it.role } as Set 
    } 
} 

그런 다음 당신은 hasMany의 거기 것처럼 userInstance.authorites 등의 작업을 수행 할 수 있습니다. 기본적으로, 당신은 Grails가 전형적인 것을 할 것입니다. 그러나 이것은 실제로 좋은 것입니다. Grails의 컬렉션은 제대로 수행되지 않으면 비용이 많이들 수 있습니다. 이 기능은 2.0에서 Bag을 사용하여 해결되었습니다.

+0

답변 해 주셔서 감사합니다. 내 예에서 DomainA와 DomainB는 어떨까요? 나는 '속한다'와 '많은 것이있다'를 제거해야합니까? – jason

+0

예, 필요하지 않습니다. 나는 그것을 처리하는 방법을 반영하기 위해 나의 대답을 업데이트 할 것이다. – Gregg

+0

감사합니다. 이러한 변경 사항을 적용하고 작동 방식을 확인합니다. – jason