0

hibernate.Undergrails 1.3.7すべてが正常に動作する grails アプリケーションを使用していますが、切り替えるとgrails 2.0.3次の問題が発生します。

java/srcディレクトリの下の一意のフィールドを確認できません。同じ一意キーを持つレコードを追加または更新しようとすると、一括挿入エラーが表示されます。

検証src/groovyを確認するクラスを作成します。

Example: LanguageCommand.groovy

package myproject.command

import org.codehaus.groovy.grails.validation.Validateable;

@Validateable
class LanguageCommand {

    String code
    String codeDescription

    static constraints= {
        code(blank:false, maxSize:50)
        codeDescription(maxSize:200)
    }
}

そしてsrc/java、一意のフィールドをチェックするクラスを作成します

Example: LanguageConstraints.groovy

package myproject.model

    constraints = {
        code unique: true
    }

myproject.model、hibernate クラスを含むパッケージの名前です。

ノート: Validation class works fine but the unique one not. i try to add unique constraints to validation class, same error appears

エラー:

Error 500: Executing action [save] of controller 
           [myproject.controller.LanguageController] 
           caused exception: Runtime error executing action
Servlet: grails
URI: /myproject/grails/language/save.dispatch
Exception Message: Batch entry 0 insert into language 
                   (language_code, code_description, version, id) 
                   values (en, English, 0, 1) was aborted. 
                   Call getNextException to see the cause.
Caused by: Batch entry 0 insert into language 
           (language_code, code_description, version, id) 
           values (en, English, 0, 1) was aborted. 
           Call getNextException to see the cause.
Class: LanguageController
At Line: [125]
Code Snippet:

何か助けはありますか?

4

2 に答える 2

2

以下src/groovyに、LanguageCommand.groovy クラスを作成します。

package myproject.command

import org.codehaus.groovy.grails.validation.Validateable;

@Validateable
class LanguageCommand {
    String oldCode
    String code
    String codeDescription

    static constraints= {
        code(maxSize:40, blank:false, validator: { val, obj ->
            if((obj.oldCode != val) && (Language.findWhere(code:val) != null))
                return['constraints.unique.code']
        })
        codeDescription(maxSize:200)
    }
}

そして i18n/messages.properties に次のように書く必要があります(the message you want to display it):

constraints.unique.code = code must be unique

そして、検証のチェックの前に更新メソッドのコントローラーで、次のように記述する必要があります。

def update = {  
    LanguageCommand languageCommand ->
    Language languageInstance = Language.get(params.id)
    if(languageInstance) {
        languageCommand.oldCode = languageInstance.code
        if (!languageCommand.validate()){
            ...
            ...
        }
        ...
        ...
    }
    ...
    ...
}

注: oldCode は create ではなく update でのみ使用されます。更新前にコードを格納します。これは、コードを変更せずにコードで言語を検索すると、結果が返されるためです。 t コードで言語を検索します。

これがあなたを助けることを願っています

于 2012-07-26T13:48:38.340 に答える
0

Grails 2 では、一意の制約は GORM ドメイン (gorm マッピング) にのみ適用できますが、Hibernate ドメイン (hibernate マッピング) には適用できません。適切なバリデーターが grails に追加されました。クラスisValidのメソッドを参照してください。AbstractPersistentConstraint

Grails 1.3.x はこれをチェックしませんでした。

于 2012-11-05T09:30:10.353 に答える