2015-05-29 41 views
0

您可以检查Grails域类中的自定义验证器内字段的组合唯一性吗?Grails域自定义验证器检查唯一性

Long points 
String field1 
String field2 
Level level 

level validator {val,obj-> 

if(obj.points<1000){ 
    //make sure level is unique with field 1 
    level unique: ['field1'] 
} 
else{ 
    //make sure level is unique with field 2 
    level unique: ['field2'] 
} 

} 
+0

你不能用这种方式指定唯一性。请记住,在数据库级别指定唯一性,并且不能在数据库中执行此操作。 – cantoni

+0

所以我将不得不运行一个查询,并检查组合是否已经存在?findWhere(level:val,field1:object.field1)?// valid:// error – user2782001

+1

是啊!在这种情况下,您必须创建一个可定制的解决方案来确保应用程序的唯一性。请记住,如果你想要数据库中的唯一性,你需要两个表(一个包含Field1 + Level的表和一个包含Field2 + Level的表)。 – cantoni

回答

1

你不能。唯一的约束是DDL约束。这意味着当您的应用程序启动时,Grails/Hibernate将在您的数据库模式中创建一个唯一的索引,因此约束保持不变。验证器约束只是一个闭包,每当你的域类被验证时,它都会在运行时被执行。

您必须验证自己使用查找器或条件检查数据库中的实体的唯一性,如果唯一条件已存在,则拒绝该错误。在你的发现者中,不要忘记排除你正在验证的记录。