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是包含休眠类的包的名称。

笔记: 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 仅用于更新而不是创建,我们将更新前的代码存储在其中,因为如果我们通过代码搜索语言而不更改它会返回结果,那么当代码 = 等于旧代码时我们没有' t 按代码搜索语言。

希望这对你有帮助

于 2012-07-26T13:48:38.340 回答
0

在 Grails 2 中,唯一约束可能仅适用于 GORM 域(gorm 映射),而不适用于 Hibernate 域(休眠映射)。在 grails 中添加了适当的验证器。见类isValid方法AbstractPersistentConstraint

Grails 1.3.x 没有检查这个。

于 2012-11-05T09:30:10.353 回答