3

我被这个问题困住了。代码对我来说看起来不错(显然我遗漏了一些东西。问题是它是什么?)

我有一个项目类

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:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例:管理器

当我这样做时

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

它工作得很好。但我认为 project?.manger.save() 不应该是必需的!

4

1 回答 1

2

一个快速的解决方法是在保存项目之前保存经理。

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

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

“在双向一对多的情况下,多方未定义belongsTo,则级联策略设置为一侧的“SAVE-UPDATE”和多方的“NONE”。”

因此,如果我正确理解了这一点,您可以在管理人员(一方面)上调用保存,但不能在项目方面保存(以使级联工作)

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

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

于 2010-07-16T21:41:23.020 回答