2015-10-01 77 views
0

我有兩個域類Person和Workshop。研討會擁有Person類型的所有者,以及Person類型的許多參與者。一個人可以成爲許多研討會的參與者。當在研討會上註冊人員時,我想從Workshop一邊這樣做,例如workshop.AddToParticipants(),這是我如何設置我的域類。不需要的GORM表創建

class Person { 
    String name 

    static hasMany = [enrolledWorkshops: Workshop] 
    static belongsTo = [Workshop] 

} 

class Workshop { 
    Date startDate 
    Date endDate 
    String name 

    Person owner 
    static hasMany = [participants: Person] 
} 

GORM正確地創建具有WORKSHOP_ID和PERSON_ID列的WORKSHOP_PARTICIPANTS表,並增加了一個OWNER_ID列到WORKSHOP表。這很好。

但是,它也會創建帶有PERSON_ID和OWNER_ID列的WORKSHOP_OWNER表!這對我來說毫無意義,無論我如何嘗試改變GORM關係,我都無法在不創建這個令人討厭的額外表格的情況下如何工作。我如何防止創建WORKSHOP_OWNER表?任何幫助是極大的讚賞! (如果有任何幫助,我正在使用Grails 2.3.7)

+1

不應該屬於你在工作坊:'static belongsTo = [owner:Person]'? –

+0

@NathanHughes我認爲不是因爲那樣我就不得不添加像person.AddToEnrolledWorkshops()這樣的研討會。我繼續設置它,雖然我運行應用程序時實際上收到以下錯誤:加載插件管理器時出錯:沒有所有者在域類[class app.Person]和[class app.Workshop]一對多的關係。例如:static belongsTo = app.Workshop – zero01alpha

+0

它們看起來都有許多對方,並且還有一個belongsTo,一方是Person,它是無參考關係。我想如果你刪除靜態hasMany = [enrolledWorkshops:Workshop],那麼你會得到所需的行爲。由於沒有引用關係,即靜態belongsTo = [工作坊]允許所需的行爲「一個人可以是許多車間的參與者」 – Vahid

回答

1

爲了擺脫WORKSHOP_OWNER表,您必須在Workshop類中將Person owner替換爲static belongsTo = [owner: Person]。但是這與Person類中的static belongsTo = [Workshop]相沖突。兩者都不能成爲所有者。

嘗試這種情況:

class Person { 
    String name 
} 

class Workshop { 
    Date startDate 
    Date endDate 
    String name 

    static belongsTo = [owner: Person] 
    static hasMany = [participants: Participant] 
} 

class Participant { 
    person person 

    static belongsTo = [workshop: Workshop] 
} 

在上述例子中,一個Person擁有WorkshopParticipantWorkshop擁有。車間表將得到一個owner_id來引用該人員,該人員除去了workshop_owner表。

添加PersonWorkshop你只需將它放在一個Participant

​​

你會鬆enrolledWorkshops財產Person,但你可以完成同樣的事情與查詢。

def workshops = Workshop.withCriteria { 
    participants { 
     eq 'person', somePerson 
    } 
} 
+0

謝謝!這很好。作爲一個側面的問題,你會碰巧知道是否有辦法在belongsTo屬性中聲明引用和非引用GORM關係?如靜態belongsTo = [owner:Person,Domain1,Domain2] – zero01alpha

+1

根據我對從域類讀取belongsTo屬性的源代碼的理解,no。然而,由於belongsTo似乎是被繼承的,像這樣的(壓扁的)代碼可能會工作:類class WorkshopOwner {static belongsTo = [Domain1,Domain2]} class Workshop extends WorkshopOwner {...}'你還必須考慮哪些繼承策略使用。默認情況下,子類中的屬性必須爲空。 https://github.com/grails/grails-data-mapping/blob/master/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy。java –

+0

我會玩這個,再次感謝:) – zero01alpha