3

私はこの問題で立ち往生しています。コードは私には問題ないように見えます(明らかに私は何かが欠けています。問題はそれが何であるかです?)

プロジェクトクラスがあります

def class project{
    ...
    Manager manager
 }

これはPersonおよびManagerクラスの定義です

def class Person{
   String firstName
   String lastName
}

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

}

関係は単純です。プロジェクトには1人のマネージャーがいて、マネージャーには多くのプロジェクトがあります。私の知る限り、1対多の関係では、双方向の1対多であるため、保存はカスケードされます。しかし、私がこれを行うとき

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()

それはうまく機能します。しかし、project?.manger.save()は必要ないと思います!!

4

1 に答える 1

2

簡単な解決策は、プロジェクトを保存する前にマネージャーを保存することです。

また、belongsToの設定もありません。Grailsドキュメントの第5章を確認してください。

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

「多側がbelongsToを定義しない双方向の1対多の場合、カスケード戦略は片側が「SAVE-UPDATE」、多側が「NONE」に設定されます。」

したがって、これを正しく取得した場合、mgr(片側)でsaveを呼び出すことはできますが、プロジェクト側(カスケードを機能させるため)では保存できません

多側がbelongsToを定義する双方向の1対多の場合、カスケード戦略は片側が「ALL」、多側が「NONE」に設定されます。

また、カスタムカスケード動作を指定できるセクション5.5.2.9も確認してください。

于 2010-07-16T21:41:23.020 に答える