【发布时间】:2013-08-18 14:03:08
【问题描述】:
我想在我的域类上使用@EqualsAndHashCode 注释,但该注释生成的equals 和hashCode 方法似乎没有考虑hasMany 字段。我看不出有任何方法可以用注释改变它,但我希望我遗漏了一些东西,因为它非常方便(如果它有效的话)。
【问题讨论】:
我想在我的域类上使用@EqualsAndHashCode 注释,但该注释生成的equals 和hashCode 方法似乎没有考虑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。
【讨论】:
hasMany 使用 Set 不是吗?因此,如果我只使用 set,我是否可以期望从典型的 Grails hasMany 关系中得到相同的行为?你能举例说明我为什么要使用List而不是Set吗?