2015-01-21 9 views
1

나는 다음과 같은 관계가 설정 한 복제 :Grails의 addTo는

class Applicant { 
    String appStepsComplete 
    String name 
    String eNumber 
    String email 
    String homePhone 
    String cellPhone 
    String address 
    Integer age 

    static hasMany = [scholarships:Scholarship] 

    static mapping = { 
     scholarships joinTable: [name:"APPLICANT_SCHOLARSHIPS"] 
    } 
} 

class Scholarship { 
    String fundCode 
    String seqNo 
    String name 

    static belongsTo = Applicant 
} 

나는 그것이 중복 허용하고이 데이터베이스에 추가 할 수 호출 오전 :

applicant.scholarships << schol 
applicant.save() 

가 나는 것을 방지 할 필요를 데이터베이스에서 중복. 나는 다음을 수행하여 신청자에 장학금에 고유 제한 조건을 설정했지만, 그것은 작동하지 않았다

static constraints = { 
    scholarships(unique:true) 
} 
+2

'장학금'에'hashCode'와'equals'을 구현해야합니다. 그렇지 않으면 유일성을 결정할 수 없습니다. –

답변

2

버트 백 위드의 의견이 옳다, 당신은 해시 코드를 재정의해야하고 장학금에 같습니다. 비즈니스 키 (이 엔티티를 고유하게 식별하는 필드의 조합인데, 데이터베이스가 인공 id를 사용하지 않는 경우 복합 자연 키로 사용함)는 fundCode와 seqNo의 조합으로 다음과 같은 것을 가질 수 있습니다 :

int hashCode() { 
    (fundCode + seqNo).hashCode() 
} 

boolean equals(Object other) { 
    other?.getClass() == this.class 
    && other.fundCode == fundCode 
    && other.seqNo == seqNo 
} 

의 해시 코드의 구현은 문자열의 해시 코드에 기대어, 그것을 할 수있는 게으른 방법입니다, 아마 사상 최고 성능의 일이 아니다. 그러나 속임수 문제를 해결하는지 여부를 판단하는 것으로 충분합니다.

건조기 솔루션은 당신을 위해 equals 메소드와 hashCode 메소드를 생성이 주석

import groovy.transform.EqualsAndHashCode 

@EqualsAndHashCode(includes=['fundCode', 'seqNo']) 
class Scholarship { 
    String fundCode 
    String seqNo 
    String name 

    static belongsTo = Applicant 
} 

와 함께 AST 변환을 사용하는 것입니다.

Set 구현은 두 개체 인스턴스가 동일한 정보를 나타내는 지 여부를 결정하기 위해 이러한 메서드를 사용합니다. 재정의하지 않는다는 것은 유일한 참조가 동일한 참조인지 여부를 확인하는 것입니다. 따라서 같은 정보를 가진 다른 객체 인스턴스가있는 경우 두 개의 다른 객체로 처리됩니다. ID 대신 비즈니스 정보를 사용하여 동등성을 검사하면 도메인 객체에 할당 된 ID가 있는지 여부에 관계없이 작동합니다.

+0

무엇이'@ EqualsAndHashCode'입니까? – cfrick

+0

@cfrick : 감사합니다. 나는 그것을 사용하려고 시도하지 않았다, 그것이 GORM과 함께 얼마나 좋은가, 그리고 제외되어야 할 것들이 더 있는지 궁금해했다. –

+0

더 안전한 내기는 단지 포함 할 것이라고 생각합니다. – cfrick