2015-01-21 3 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' в 'Scholarship', иначе уникальность не может быть определена. –

ответ

2

комментарий Burt Беквит является правильным, вы должны переопределить хэш-код и равняется на Scholarship. Предполагая бизнес-ключ (комбинация полей, которые однозначно идентифицируют этот объект, который вы использовали бы как составной естественный ключ, если база данных не использовала искусственный идентификатор) для этого является комбинацией fundCode и seqNo, у вас может быть что-то вроде :

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

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

реализация хэш-код, вероятно, не лучший выполнения вещь когда-либо, это ленивый способ сделать это, опираясь на хэш-код струны. Но достаточно сказать, исправляет ли он проблему обмана.

решение сушилки использовать преобразование AST с этой аннотацией

import groovy.transform.EqualsAndHashCode 

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

    static belongsTo = Applicant 
} 

, который будет генерировать равные и методы Hashcode для вас.

Реализация Set основана на этих методах, чтобы решить, представляют ли два экземпляра объекта одну и ту же информацию. Не переопределение означает, что единственная проверка заключается в том, являются ли ссылки одинаковыми (поэтому в случае, когда у вас есть разные экземпляры объектов, которые имеют одинаковую информацию, они будут рассматриваться как два разных объекта). Использование бизнес-информации вместо идентификатора для проверки равенства означает, что оно будет работать независимо от того, имеет ли объект домена назначенный идентификатор.

+0

как насчет '@ EqualsAndHashCode'? – cfrick

+0

@cfrick: спасибо, добавил. я не пробовал использовать его, задаваясь вопросом, как хорошо он играет с GORM и есть ли еще вещи, которые нужно исключить. –

+0

Я думаю, что более безопасная ставка будет включать только – cfrick

Смежные вопросы