Grails Account for在equals和hashCode中有许多关系

Grails Account for在equals和hashCode中有许多关系,grails,equals,hashcode,Grails,Equals,Hashcode,我想在我的域类上使用注释,但该注释生成的equals和hashCode方法似乎没有考虑有许多字段。我看不出有任何方法可以通过注释来改变这一点,但我希望我遗漏了一些东西,因为它非常方便(如果可以的话)。 将hasMany关系定义为父域类中的Set,我们通常不会这样做,因为它是冗余的 您还必须确保对子域使用@EqualsAndHashCodeAST 例如: import groovy.transform.EqualsAndHashCode @EqualsAndHashCode class Pare

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

  • 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
}
导入groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
班级家长{
字符串名
整数年龄
//将其添加为属性使其成为equals()和hashCode()的候选对象
安排孩子
static hasMany=[children:Child]
}
@EqualsAndHashCode
班童{
字符串名
静态belongsTo=[parent:parent]
}
//单元测试
void testSomething(){
def parent1=新父级(名称:“测试”,年龄:20)。保存()
def child1=新子级(名称:“child1”)
父母1.子女(子女1)
parent1.save()
def parent2=新父级(名称:“测试”,年龄:20)。保存()
def child2=新子级(名称:“Child1”)
父母2.子女(子女2)
parent2.保存(刷新:true)
断言parent1==parent2
断言child1==child2
}
在这种情况下,您可能会考虑为多个项目编制索引,然后使用
List
而不是
Set

  • 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
}
导入groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
班级家长{
字符串名
整数年龄
//将其添加为属性使其成为equals()和hashCode()的候选对象
安排孩子
static hasMany=[children:Child]
}
@EqualsAndHashCode
班童{
字符串名
静态belongsTo=[parent:parent]
}
//单元测试
void testSomething(){
def parent1=新父级(名称:“测试”,年龄:20)。保存()
def child1=新子级(名称:“child1”)
父母1.子女(子女1)
parent1.save()
def parent2=新父级(名称:“测试”,年龄:20)。保存()
def child2=新子级(名称:“Child1”)
父母2.子女(子女2)
parent2.保存(刷新:true)
断言parent1==parent2
断言child1==child2
}

在这种情况下,您考虑为有许多项的项目建立索引,然后使用
List
而不是
Set

您上次评论中的“索引”是什么意思?默认情况下,
hasMany
使用
Set
不是吗?所以,如果我只使用set,我能期望从一个典型的Grails
hasMany
关系中得到相同的行为吗?你能举个例子说明为什么我想使用
List
而不是
Set
?是的,正确,默认情况下有多个use Set。如果您想作为有序子项使用,如子项[0]、子项[1]、。。。然后您可以将其用作列表。请参阅GORM文档。@ubiquibacon的答案有用吗?是的,这就是我投票的原因:)一旦我的(多方面的)问题得到解决,我将接受。我猜你看到我在一个相关的问题中把你叫出来了。@ubiquibacon是的,我看到了。:)你上次评论中的“索引”是什么意思?默认情况下,
hasMany
使用
Set
不是吗?所以,如果我只使用set,我能期望从一个典型的Grails
hasMany
关系中得到相同的行为吗?你能举个例子说明为什么我想使用
List
而不是
Set
?是的,正确,默认情况下有多个use Set。如果您想作为有序子项使用,如子项[0]、子项[1]、。。。然后您可以将其用作列表。请参阅GORM文档。@ubiquibacon的答案有用吗?是的,这就是我投票的原因:)一旦我的(多方面的)问题得到解决,我将接受。我猜你看到我在一个相关的问题中把你叫出来了。@ubiquibacon是的,我看到了。:)