在grails中保存一对多域关联对象的最佳做法是什么?

时间:2012-04-26 13:22:37

标签: grails

在圣杯中保存一对多域关联对象的最佳做法是什么?让我们考虑一个场景。

如果你有两个类A和B,A有多个B关系而B属于A,那么创建/保存/删除B域对象的最佳做法是什么。在许多情况下,它不可能在创建B对象时正如创造的那样。

由于

4 个答案:

答案 0 :(得分:4)

  

在创建As时无法创建B对象。

我很确定这不是真的。 Grails使用Hibernate,而Hibernate具有传递持久性的概念,这基本上是级联设置。默认情况下,Grails的级联设置为save-update,这意味着如果您创建新的父级和新的子级,并将子级添加到父级,则在保存父级时,应保存该子级。

没有"最佳实践"。您需要完全理解hibernate中的持久性语义,并选择对您有意义的配置。你想让孩子拥有自己的生命吗?您想要级联哪些操作?您是否希望关系是双向的,以及关系应该采用哪种方式?开发一个好的域层需要理解这些问题(以及其他类似的问题),以及答案对您所需功能的影响。

答案 1 :(得分:0)

我不太确定你究竟在问什么,但如果你问如何实例化并保存As和Bs,我会这样做:

class B {
    String name
    static belongsTo=[a:A]
}

class A {
    static hasMany=[manyBs:B]
}

然后:

def a=new A()
a.addToManyBs(name:'someB')
a.save()

答案 2 :(得分:0)

让我们调用对象所有者和宠物。初始化没有宠物的所有者对象并继续保存,只是为了证明宠物不必同时创建。

Owner owner = new Owner(pets: []).save()

现在我们可以向主人添加宠物了。我们可以用一只宠物做到这一点:

owner.pets.add(new Pet(name: "fido"))

或者我们可以使用一组宠物:

def petCollection = [
    new Pet(name: "Pete"),
    new Pet(name: "meow")
]
owner.pets.addAll(petCollection)
owner.save()

通过保存Owner对象,您将看到新创建的Pet对象也是持久的。

答案 3 :(得分:0)

你需要在域中的约束部分中赋予nullable true。 即静态约束{         可空的:真的 }