0

我有一个带有一堆域类的 Grails 应用程序,其中一些具有许多字段,其中一些hasMany与所讨论的域类有关系。对于这个特定的应用程序,我只有一个“约束”,即每个域类的每个实例都必须是唯一的。我不在乎一个任意字段是否在同一个域类的多个实例中具有相同的值,只要每个实例都由该域类中某个其他字段的值唯一。所以基本上我希望验证发生在域类实例级别而不是域类字段级别。现在我正在通过使用非常 groovy 的@EqualsAndHashCode注释来生成我的equals和方法,然后在域类的某个任意字段上hashCode调用自定义验证器来做到这一点。equals

两个问题:

  1. 是否有更有效的方法来验证域类是否唯一?
  2. 如果不是,那么有没有办法可以在域类实例本身上调用我的自定义验证器代码,而不是通过域类实例的一个字段?
@groovy.transform.EqualsAndHashCode
类 MyDomainClass {
    串一些
    整数任意
    布尔字段
    静态约束 = {
        // 我选择验证的字段无关紧要,我只需要在**某处**运行验证代码
        任意验证器:{ val, obj ->
            返回 !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)
4

1 回答 1

1

这将确保域中 3 个字段的组合是唯一的。这也确保了约束在数据库级别,而不仅仅是应用程序级别。

class MyDomainClass {
    String some
    int arbitrary
    boolean field
    static constraints = {
        some(unique: ['arbitrary', 'field'])
    }
}
于 2013-08-17T16:24:58.330 回答