2010-07-16 34 views
2

我被困在這個問題。代碼看起來OK,我(顯然我失去了一些東西,但問題是它是什麼?)Grails級聯行爲

我有一個工程類

def class project{ 
    ... 
    Manager 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() 

它工作得很好。但我認爲項目?.manger.save()不應該是必需的!

回答

2

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

您也沒有belongsTo設置。查看Grails文檔的第5章。

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

「以的情況下,雙向one-to-許多其中許多側沒有定義屬於關聯然後級聯策略被設置爲‘SAVE-UPDATE’爲一面和‘NONE’爲了多方。「

所以,如果我得到這個正確的,你可以調用保存的經理(的一面),但不保存在項目方(獲得級聯工作)

在雙向單的情況下,其中許多方定義了belongsTo,那麼級聯策略對於多方而言被設置爲「ALL」,而對於多方而言,「NONE」被設置爲「ALL」。

您還可以查看5.5.2.9節,您可以在其中指定自定義級聯行爲。

+0

感謝您的回答。是的儲蓄管理人員首先做的伎倆。但belongsTo沒有幫助。這是正確的方法做到這一點 i)刪除管理器經理,只是有 靜態belongsTo = [經理:經理]或靜態belongsTo =經理 ii)保持經理經理和擁有靜態belongsTo = [經理:經理]或靜態belongsTo =管理器。 順便說一句,我試過了,它不起作用。現在快速修復工作 – Paras 2010-07-16 21:57:43

+0

嗯我認爲正確的方法是挽救一方。 「在雙方一對多的情況下,許多方面定義了belongsTo,然後級聯策略被設置爲一方爲」全部「,而另一方爲」無「。」即使對於屬於,對於許多方面來說級聯也是無效的。如果一方尚未執行,先保存多方將不起作用。 我認爲這是有道理的,因爲通常情況下,您會向系統添加一個管理器,保存它,然後添加項目。雖然我可以看到你會同時做這兩件事的情況。 – hvgotcodes 2010-07-16 22:02:23