2015-05-29 42 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將在您的數據庫模式中創建一個唯一的索引,因此約束保持不變。驗證器約束只是一個閉包,每當你的域類被驗證時,它都會在運行時被執行。

您必須驗證自己使用查找器或條件檢查數據庫中的實體的唯一性,如果唯一條件已存在,則拒絕該錯誤。在你的發現者中,不要忘記排除你正在驗證的記錄。