2

Client オブジェクトがあります。

class Client{
String firstName
String lastName
String middleName
}

それから私は、母が父と同等になれない形をしています。クライアントを比較するには、どのバリデーターがより適切でしょうか? 違いはありますか?私は両方を試してみましたが、うまくいきましたが、それが単なる偶然なのかどうかはわかりません. 私も間違っているかもしれません。2 つのオブジェクトの比較はどのように行われますか? 何かアドバイス?

val.id == obj.father.idまたval == obj.father

class Form{
Client mother
Client father

static constraints = {
mother (nullable:true, validator: { val, obj ->
            if(mother equals father){
                return ["invalid.motherCannotBeEqualFather.label"]  
            }
        })
}
}
4

1 に答える 1

2

val == obj.father

val.equals(obj.father)Groovy が == をオーバーロードするため、結果はになります。これのデフォルトの動作は、単に参照の等価性をチェックすることですが、これは危険な場合があります。Hibernate は平等を保証しようとしますが (Fabiano によるリンクを参照)、信頼できない場合があります。

val.id == obj.father.id

2 つのオブジェクトが、ドメイン オブジェクトに関連付けられたデータベース テーブル内の異なるエントリを表していることを確認します。新しいドメイン オブジェクトを保存すると、Grails はオブジェクトにそのドメイン内で一意の ID を割り当てます。デフォルトでは、これは、オブジェクトを表す DB テーブルの増分 ID で実現されます。

この検証が実行されたときに母と父がすでに DB に保存されている場合、これは有用な等価チェックになる可能性があります。

フォーム上で firstName、lastName、および middleName が同じになるのを防ぐだけの場合、この検証は、クライアント ドメインのグループとしてこれらのフィールドに一意性制約を定義した場合にのみ有効です。 、例えばfirstName(unique: ['lastName', 'middleName'])

探している一意性を明示的に保証するバリデーターを定義することを検討してください。

于 2012-11-16T18:06:24.017 に答える