Grails级联行为

时间:2010-07-16 21:32:44

标签: hibernate grails cascade

我遇到了这个问题。代码看起来不错(显然我错过了一些东西。问题是它是什么?)

我有一个Project类

def class project{
    ...
    Manager manager
 }

这是Person和Manager类定义

def class Person{
   String firstName
   String lastName
}

def class Manager extends Person{
   static hasMany = [ projects: Project]

}

关系很简单 - 项目有一个经理,经理有很多项目。据我所知,在一对多的关系中,存储级联,因为它是双向的一对多。但是当我这样做时

Project project = new Project()
Manager mgr = new Manager(...)
project.manager = mgr
project.save()

我收到以下错误 引起:org.hibernate.TransientObjectException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Manager

当我这样做时

Project project = new Project()
Manager mgr = new Manager(...)
project.manager = mgr
project?.manager.save()
project.save()

它运作得很好。但我认为不应该要求项目​​?.manger.save()!!

1 个答案:

答案 0 :(得分:2)

快速解决方法是在保存项目之前保存管理器。

您也没有belongsTo设置。查看grails文档的第5章。

http://grails.org/doc/latest/

“在双向一对多的情况下,许多方面没有定义belongsTo,那么级联策略的一方为”SAVE-UPDATE“,多方为”NONE“。

所以,如果我正确地得到了这个,你可以在mgr(一方)上调用save,但不能保存在项目一侧(以便级联工作)

在双向一对多的情况下,许多方定义了belongsTo,那么级联策略对于一方设置为“ALL”而对于多方设置为“NONE”。

您还需要查看5.5.2.9节,您可以在其中指定自定义级联行为。