2010-09-17 63 views
0

我想設置幾個域類。我會用英文解釋它,我想知道如何在grails中設置域名。大寫字是我的域名grails中的變量聲明與belongsTo關係相同嗎?

員工有教育。僱員有許多僱主(過去和現在)。員工爲每個僱主都有一個或多個項目。項目有一定的作用,客戶端...等

現在的問題是,當例如,我定義的僱主,將我放

hasMany = [projects:Project] 

以及在項目投產

belongsTo = [employer:Employer, employee:Employee, client:Client] 

心靈你 - 許多員工可能在同一個項目上工作過,所以我可能想找出一種方法來定義這個項目?

會我也把僱主:

ArrayList<Project> project = new ArrayList(); 
    static hasMany = [projects:Project] 

或者是多餘的?

回答

1

變量聲明是而不是與定義belongsTo關係相同。 belongsTo通常與持久性操作的級聯發揮作用,尤其是刪除。舉例來說,如果你有兩類:如果一個特定的項目屬於一個員工,而員工被刪除,該項目將被刪除

// Employee.groovy 
Project project 

// Project.groovy 
static belongsTo = Employee 

。這裏的another SO question有一個很好的答案。

對於第二個問題,是的,定義List是多餘的。如果你這樣做:

static hasMany = [projects: Project] 

該集合是隱式定義的域。但是,在某些情況下,您可能需要初始化集合以便在constraints之內使用。有關更多詳細信息,請參閱this issue

+0

你不必,只要將它定義爲您所使用的地圖符號。您可以簡單地使用hasMany = [foos:Foo],然後將該聲明用於約束。 – Gregg 2010-09-17 20:35:03

+0

從1.3開始是新的嗎?我知道我至少在1.2.0中無法做到這一點。 – 2010-09-17 20:37:48

+0

可能是。自從我在代碼的1.2.x分支中出現以來已經有一段時間了。 – Gregg 2010-09-17 20:41:52

1

這是多餘的,但您的示例並不完全準確地描述您所描述的內容。默認情況下,當你定義一個hasMany時,Grails將創建一個Set。你的代碼要做的是使用ArrayList而不是Set,但關係完全相同。我假設你的意思是你的項目ArrayList實際上是複數(項目s)。

而且,只是一個側面說明,你應該總是使用接口declar你的類型變量,而不是一個實現:

List<Project> projects = new ArrayList<Project>() 
+0

+1,特別是關於接口類型的說明 – 2010-09-17 20:54:38

+0

只需要清楚這一點 - 關係將完全相同,但是由於我將項目定義爲(對,你是對的,意味着它是「項目」),因爲一個ArrayList,那麼我將能夠在這些對象上使用這些特殊的ArrayList方法,對吧? – Derek 2010-09-20 14:26:57