2011-10-27 116 views
1

我有以下域類Grails中:的Grails - 防止遞歸一個一對多的關係

class TreeNode { 
    String name 
    String description 

    static hasMany = [childNodes: TreeNode] 
} 

什麼是保證樹節點的實例,不能有自己的孩子是最地道的Grails方式?我可以在域類中作爲約束來做到這一點,還是應該在TreeNodeController的Save操作中編寫自定義代碼?

回答

1

將其作爲自定義約束。

static constraints = { 
    childNodes(validator: {value, obj, errors-> 
     if(value.contains(obj) { 
     errors.rejectValue('childNodes', 'Cannot contain self') 
     } 
    } 
} 
1

答案取決於你想要檢查孩子的深度。如果你只是擔心眼前的孩子,那麼來自@Tiggerizzy的代碼應該可以正常工作。

另一方面,如果要驗證節點不是樹中的直接子樹或深層子樹,則應將邏輯撤出驗證並置於Grails服務類中。這將提供至少有兩個好處:

  1. 如果節點改變等性能,但不是樹的結構,你可以跳過孩子檢查驗證和確認時保存自己額外的處理時間。
  2. 如果您從樹的根部或根部進行驗證,那麼驗證所有子子樹對於大型樹來說是一個較長的過程,涉及大量的數據庫工作。通過在Service類中執行此項工作,您將獲得Service的事務性質,該性質將回滾未處理的數據庫更改,例如處於與另一個線程的樂觀鎖定情況下。