【问题标题】:Account for hasMany relationships in equals and hashCode在 equals 和 hashCode 中考虑 hasMany 关系
【发布时间】:2013-08-18 14:03:08
【问题描述】:

我想在我的域类上使用@EqualsAndHashCode 注释,但该注释生成的equalshashCode 方法似乎没有考虑hasMany 字段。我看不出有任何方法可以用注释改变它,但我希望我遗漏了一些东西,因为它非常方便(如果它有效的话)。

【问题讨论】:

    标签: grails equals hashcode


    【解决方案1】:
    • 在父域类中将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

    【讨论】:

    • 上一条评论中的“索引”是什么意思?默认情况下 hasMany 使用 Set 不是吗?因此,如果我只使用 set,我是否可以期望从典型的 Grails hasMany 关系中得到相同的行为?你能举例说明我为什么要使用List而不是Set吗?
    • 是正确的,默认情况下 hasMany 使用 Set。如果您想像 children[0]、children[1]、...这样的有序子项使用,那么您可以将其用作列表。参考 GORM 文档中的List Of Objects
    • @ubiquibacon 答案有帮助吗?
    • 是的,这就是我投票的原因:) 一旦我的(多方面的)问题得到解决,我就会接受。猜猜你看到我在一个相关问题here 中叫你出来。
    • @ubiquibacon 是的,我做到了。 :)
    猜你喜欢
    • 2011-01-05
    • 2010-09-06
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多