繁体   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