[英]Validate instance of domain class is unique
我有一個帶有一堆域類的Grails應用程序,其中一些域類很多,其中一些與所討論的域類具有hasMany
關系。 對於此特定應用程序,我只有一個“約束”,即每個域類的每個實例都必須是唯一的。 我不在乎任意字段在同一域類的多個實例中是否具有相同的值,只要該域類中某個其他域的值使每個實例具有唯一性即可。 因此,基本上,我希望驗證在域類實例級別而不是域類字段級別進行。 現在,我通過使用非常@EqualsAndHashCode
批注生成我的equals
和hashCode
方法,然后在域類的任意字段的自定義驗證器中調用equals
來做到這一點。
兩個問題:
@groovy.transform.EqualsAndHashCode class MyDomainClass { String some int arbitrary boolean field static constraints = { // The field I chose to validate on is irrelivant, I just need to run the validation code **somewhere** arbitrary validator: { val, obj -> return !MyDomainClass.getAll().contains(obj) } } }
我還應該補充一點,我正在尋找一種通用的(希望高效)的方法。 我意識到,調用getAll()
效率很低,相反,調用find
某種變體或對每個域類的確切字段執行HQL查詢將更加高效……這只花了更長的時間!
例子
assert MyDomainClass.getAll().isEmpty() // true
def myDomainClass1 = new MyDomainClass( some: "foo", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass1); // false
myDomainClass1.save(flush:true)
def myDomainClass2 = new MyDomainClass( some: "bar", arbitrary: 1, field: true)
assert MyDomainClass.getAll().contains(myDomainClass2); // false. Even though this has the same `arbitrary` value as myDomianClass1, it has a different `some` value which makes it unique.
myDomainClass2.save(flush:true)
def myDomainClass3 = new MyDomainClass( some: "foo", arbitrary: 1, field: false)
assert MyDomainClass.getAll().contains(myDomainClass3); // false. Even though this has the same `some` value as myDomainClass1 and the same `arbitrary` value as myDomainClass1 and myDomainClass2, it has a different `field` value which makes it unique.
myDomainClass3.save(flush:true)
這將確保域中3個字段的組合是唯一的。 這還可以確保約束位於數據庫級別,而不只是應用程序級別。
class MyDomainClass {
String some
int arbitrary
boolean field
static constraints = {
some(unique: ['arbitrary', 'field'])
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.