2012-07-25 120 views
0

我使用hibernate .Under grails 1.3.7一切正常Grails应用程序,但是当我切换到grails 2.0.3出现以下问题:Grails的唯一约束

我不能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: 

任何帮助吗?

+0

你为什么要在'src/java'中放一个'.groovy'类? – 2012-07-25 12:08:42

+0

用于测试唯一约束,因为http://grails.org/doc/latest/guide/hibernate.html#addingConstraints – 2012-07-25 12:33:47

回答

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) 
    } 
} 

和国际化/ 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是一个用于更新而不是创建,我们在它存储更新之前的代码,因为如果我们通过代码搜索语言而不改变它返回结果,那么当代码=等于旧代码我我们没有通过代码搜索语言。

希望这有助于你

+0

这不匹配。请解释更多... – 2012-07-27 12:21:18

+0

现在看到我的答案 – 2012-07-30 14:25:47

+0

这个答案解决了我的问题,但是我想知道我的代码中有什么问题? – 2012-07-30 14:58:51

0

Grails中2,唯一约束,可以只对格姆域(GORM映射)应用,但不休眠域(休眠映射)。 grails中添加了适当的验证器。请参见AbstractPersistentConstraint类的isValid方法。

Grails 1.3.x没有检查这个。