在equals和hashCode中考虑hasMany关系

时间:2013-08-18 04:43:55

标签: grails equals hashcode

我想在我的域类中使用@EqualsAndHashCode注释,但该注释生成的equalshashCode方法似乎不会占用hasMany个字段考虑到了。我没有看到任何改变这个注释的方法,但是我希望我错过了一些东西,因为它很方便(如果它有效)。

1 个答案:

答案 0 :(得分:3)

  • 在父域类中将hasMany关系定义为Set,我们通常不这样做,因为它是多余的。
  • 您还必须确保将@EqualsAndHashCode AST用于子域。

例如:

import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
class Parent {
    String name
    Integer age

    //Adding this as a property makes it a candidate for equals() and hashCode()
    Set<Child> children

    static hasMany = [children: Child]
}

@EqualsAndHashCode
class Child {
    String name
    static belongsTo = [parent : Parent]
}

//Unit Test
void testSomething() {
    def parent1 = new Parent(name: 'Test', age: 20).save()
    def child1 = new Child(name: 'Child1')
    parent1.addToChildren(child1)
    parent1.save()

    def parent2 = new Parent(name: 'Test', age: 20).save()
    def child2 = new Child(name: 'Child1')
    parent2.addToChildren(child2)
    parent2.save(flush: true)

    assert parent1 == parent2
    assert child1 == child2
}

如果您考虑索引hasMany项目,请使用List代替Set