2013-02-26 98 views
2

在我目前的項目中,我無法堅持一對多的關係。 雙方的關係將被保存 - 只是他們之間的鏈接丟失。不能堅持一對多的關係

我的兩個域之間的一個一對多的關係是這樣的:

class Parent { 
    String name 
    ... 

    static hasMany = [childs: Child] 

    Parent() {} 

    Parent(SomeOtherClass obj) { 
     this.properties = obj.properties 
    } 
} 

class Child { 
    int code 
    String description  
} 

我創建一個ParentService內我Parent實例:

public Boolean createParents(List parentIds) { 
    boolean savedSuccessfully = true 
    Parent.withTransaction {status -> 
     parentIds.each { parentIdString -> 
      if (parentIdString && parentIdString.isInteger()) { 
       int parentId = parentIdString.toInteger() 

       def parentInstance = new Parent(someOtherService.getExternalParentObj(parentId)) 

       someOtherService.getExternalChilds(parentId).each { entry -> 
        parentInstance.addToChilds(Child.findOrSaveWhere(code: entry.key, description: entry.value)) 
       } 

       if(!parentInstance.save()) { 
        status.setRollbackOnly() 
        savedSuccessfully = false 
       } 
      } 
     } 
    } 

    return savedSuccessfully 
} 

兩者的Parent實例和Child實例已成功創建並保存。父母和孩子之間的聯繫缺失。每個Parent實例的childs屬性是一個空列表。

我dont't知道什麼是錯在這裏。 爲什麼關係不會持續?有任何想法嗎?

更新

我已經添加了ParentService集成測試創建所有Parent實例後,測試childs名單的存在:

... 
assert parentService.createParents(["123","234","356"]) == true 
def parent = Parent.get(1) 
assert parent.childs.size() > 0 
... 

不料 - 測試通過。

+0

你能否證實的Grails能夠正確地創建 – uchamp 2013-02-26 17:13:00

+0

是父母,孩子和parent_child表 - 正確創建的所有表。 _parent_表和_child_表將被填充。只是連接表_parent_child_爲空... – aiolos 2013-02-26 20:20:37

+0

ParentService和someOtherService的事務屬性是什麼?您是否曾嘗試在調用其他服務(並添加子項)之前保存/刷新父實例? – codelark 2013-03-05 23:03:01

回答

0

我找到了錯誤的來源。

我完全錯過了一些entry.valuenull。不知道爲什麼我在調試過程中沒有看到它。

現在我只使用Child.findOrSaveWhere()如果entry.value不是null

我本來期望整個parentInstance.save()會通過或完全失敗。仍然不明白爲什麼連接表不會填充任何錯誤。

+0

將'failOnError:true'參數添加到'save()'可能會導致你的行爲。 – 2013-03-11 19:42:16