簡體   English   中英

域類中的包含關系(Grails)

[英]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 BRoleType A > RoleType CRoleType B > RoleType C關系。 然后,您可以由單親查詢此表,並獲取其所有隱含的子代/后代。 我已經看到完成復雜的ACL處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM