簡體   English   中英

GORM雙向一對多

[英]GORM bidirectional One-to-Many

我正在嘗試在GORM中創建Foo和Bar域之間的雙向一對多關系。

這是我到目前為止所擁有的:

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;
   }
}

如果您閱讀文檔 ,您將了解到,正如您發現但仍在質疑,將項目添加到集合以便正確保留的正確方法是使用addTo*方法。

所以在你的情況下,當你說使用addToBars工作時,這是正確的方法。 也就是說,你有一些性能打擊。 另一種方法是:

bar.foo = foo
bar.save()

缺點是foo在其現有Set中不包含bar。 你必須再次從數據庫中提取它。 這是一個給予和接受,你只是使用最好的方法來處理你的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM