我正尝试在GORM中创建Foo和Bar域之间的双向一对多关系。GORM双向一对多
这是我到目前为止有:
class Bar {
static belongsTo = [foo: Foo]
}
class Foo {
Set bars = []
static hasMany = [bars: Bar]
}
说我有是当我去使用的关系,方法的问题,他们似乎没有表现,我认为他们应该的样子。例如,你会认为像“foo.bars.add(bar)”这样的语句也会在bar参数中设置foo字段。但是当我调用“bar.foo.id”时,我被告知foo字段为空。如果我使用“bar.foo = foo”而不是“foo.bars.add(bar)”,我可以解决这个问题。不幸的是,当我打电话“foo.bars.size()”,它告诉我,这是0
得到什么我谈论的一个更清晰的画面,这里有我的测试:
def testFoo() {
def foo = new Foo()
def bar = new Bar()
foo.bars.add(bar)
println "foo.bars.size() = ${foo.bars.size()}"
println "bar.id = ${bar.id}"
for(def xbar : foo.bars) {
println "bar.id = ${xbar.id}"
}
println "foo.id = ${foo.id}"
println "bar.foo.id = ${bar?.foo?.id}" // <- is null
}
def testBar() {
def foo = new Foo()
def bar = new Bar()
bar.foo = foo
println "foo.bars.size() = ${foo.bars.size()}" // <- is 0
println "bar.id = ${bar.id}"
for(def xbar : foo.bars) {
println "bar.id = ${xbar.id}"
}
println "foo.id = ${foo.id}"
println "bar.foo.id = ${bar?.foo?.id}"
}
我在做什么错?
注:我正在通过集成测试来运行此操作。我还发现“foo.addToBars(bar)”的工作方式我认为“foo.bars.add(bar)”和“bar.foo = foo”应该可以工作。
更新这里有一个快速的黑客我这样做,我想要做什么(使用Hibernate和JPA):
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import stuff.Foo;
public class MyList<Bar> extends LinkedList {
private Foo foo;
public MyList(Foo foo) {
this.foo = foo;
}
@Override
public boolean add(Object obj) {
boolean result = super.add(obj);
try {
Method barMethod = obj.getClass().getDeclaredMethod("setFoo", Foo.class);
barMethod.invoke(obj, foo);
}
catch(NoSuchMethodException noSuchMethod) {
noSuchMethod.printStackTrace();
}
catch(InvocationTargetException invocationTarget) {
invocationTarget.printStackTrace();
}
catch(IllegalAccessException illegalAccess) {
illegalAccess.printStackTrace();
}
return result;
}
}
我尝试了使用Hibernate和JPA的相同“实验”,但得到了相同的结果。 从Java的角度来看,我可以理解持有多个元素的Container不知道如何在关系的另一侧设置值。 (即bar.foo = foo) 但是,从数据库的角度来看,这没有任何意义。当我调用“foo.bars”时,是否也执行SQL查询“SELECT * FROM Bar WHERE foo_id =:foo_id”?如果是这种情况,那么必须设置条对象的foo字段。但事实并非如此。然而,foo.bars包含该栏。 – tygerpatch