[英]Containment relationship in domain class (Grails)
我不確定這是否是用於這種關系的正確術語,所以請糾正我。 我需要定義一個域類,該域類映射到數據庫中的表。 該類需要定義相同類型關系的層次結構。 例如,說我需要使用相同的類Admin> Manager> Supervisor> associate .. etc對以下角色進行建模。
class RoleType {
String roleName
String description
static hasMany = [parentType: RoleType]
}
因此,通過父類型,我也許可以定義層次結構。 請注意,它不是繼承。 我也可以定義與直系孩子的1:m關系。 現在,我可以輕松找到所包含的對象。 例如,如果我需要在Manager(例如,Supervisor,Associate)之下或在supervisor(Associate)之下找到所有角色,則可以使用Grails。
謝謝。
您要定義的是單向一對多,父級是關系的“所有者”。 如果您這樣定義:
class RoleType {
String roleName
String description
static hasMany = [children: RoleType]
}
然后,您可以執行以下操作:
def superManager = new RoleType(roleName: 'SuperManager')
def manager = new RoleType(roleName: 'Manager')
superManager.addToChildren(manager);
或者,我相信您可以簡寫如下相同內容:
def superManager = new RoleType(roleName: 'SuperManager').addToChildren(roleName: 'Manager').save()
通過定義與[children: RoleType]
的關系,Grails在名為children
的域上創建一個集合,您可以像其他任何屬性一樣訪問該集合,例如myRole.children.each { it.doSomething() }
。
為了更輕松地使用它,您還可以通過添加以下屬性來使關系雙向化:
RoleType parent
如果使用動態addTo*
方法,則它們應確保正確設置關系的兩端。 看看這個作為其他參考。
您在這里有一些選擇,但是我認為GORM內置沒有一種自動執行此操作的方法。
一種選擇是編寫您自己的遞歸或迭代方法,以捕獲並收集所有子代。 一個例子可以在這里找到。
另外,如果您大量執行此方法,並且成為瓶頸,則可以對數據庫進行一些手動操作。 您可能具有對RoleType表中的插入和更新進行操作的觸發器,這些觸發器維護所有RoleType之間的隱式關系列表。
例如,如果創建RoleType A
> RoleType B
> RoleType C
關系,則觸發器可能會(在單獨的表中)創建RoleType A
> RoleType B
, RoleType A
> RoleType C
和RoleType B
> RoleType C
關系。 然后,您可以由單親查詢此表,並獲取其所有隱含的子代/后代。 我已經看到完成復雜的ACL處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.