簡體   English   中英

驗證域類的實例是唯一的

[英]Validate instance of domain class is unique

我有一個帶有一堆域類的Grails應用程序,其中一些域類很多,其中一些與所討論的域類具有hasMany關系。 對於此特定應用程序,我只有一個“約束”,即每個域類的每個實例都必須是唯一的。 我不在乎任意字段在同一域類的多個實例中是否具有相同的值,只要該域類中某個其他域的值使每個實例具有唯一性即可。 因此,基本上,我希望驗證在域類實例級別而不是域類字段級別進行。 現在,我通過使用非常@EqualsAndHashCode批注生成我的equalshashCode方法,然后在域類的任意字段的自定義驗證器中調用equals來做到這一點。

兩個問題:

  1. 有沒有更有效的方法來驗證域類是否唯一?
  2. 如果否,那么有沒有辦法我可以對域類實例本身調用我的自定義驗證器代碼,而不用通過域類實例的某個字段?
@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM