Grails的唯一约束
我使用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:
任何帮助吗?
在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是一个用于更新而不是创建,我们在它存储更新之前的代码,因为如果我们通过代码搜索语言而不改变它返回结果,那么当代码=等于旧代码我我们没有通过代码搜索语言。
希望这有助于你
这不匹配。请解释更多... – 2012-07-27 12:21:18
现在看到我的答案 – 2012-07-30 14:25:47
这个答案解决了我的问题,但是我想知道我的代码中有什么问题? – 2012-07-30 14:58:51
Grails中2,唯一约束,可以只对格姆域(GORM映射)应用,但不休眠域(休眠映射)。 grails中添加了适当的验证器。请参见AbstractPersistentConstraint
类的isValid
方法。
Grails 1.3.x没有检查这个。
你为什么要在'src/java'中放一个'.groovy'类? – 2012-07-25 12:08:42
用于测试唯一约束,因为http://grails.org/doc/latest/guide/hibernate.html#addingConstraints – 2012-07-25 12:33:47