我想在域类上使用@EqualsAndHashCode批注,但似乎该批注生成的equalshashCode方法没有考虑hasMany字段。我看不到用注释更改此方法的任何方法,但我希望我缺少一些东西,因为它非常方便(如果可行)。

最佳答案

  • 在父域类中将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

    关于grails - 在equals和hashCode中说明hasMany关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18295781/

    10-10 13:14