2011-10-07 52 views
6

我正在設計一個系統,用戶之間的帖子/討論可以升級成票。在一個特定的地方,我試圖創建一對一的可選關係,但遇到了某些問題。聚光燈下實體的精簡版本如下。Grails/GORM:創建一對一的可選關係

規則:如果需要

  1. 一個帖子可以成爲票。 (可選)
  2. 一張票必須有一個帖子。 (強制)

Post.groovy

class Post { 

     String title 
     String description 
     String postedBy 

     Ticket ticket 

     static hasMany = [comments: Comment] 

    static constraints = { 
     title(blank:false) 
     description(blank:false) 
     postedBy(blank:false) 
     ticket (nullable:true,unique:true) 
    } 
} 

Ticket.groovy

class Ticket { 

     String title 
     String description 
     String postedBy 

     Post post 

     static hasMany = [responses: Response] 

     static constraints = { 
       title(blank:false) 
       description(blank:false) 
       postedBy(blank:false) 
       post (nullable:false,unique:true) 
     } 

} 

這適用到一定程度。我:

  1. 創建一個帖子留下的車票屬性無效如果當後升級成爲票
  2. 我可以明確地設置郵政票屬性指向父票。

但是,該映射不在域級別實施。它爲Ticket1指向Post1留下空間,但Post1指向Ticket2。

我試圖在票務類使用static hasOne = [post: Post],但後來才知道,它要求一個static belongsTo = [ticket: Ticket]類的存在,這成爲一個強制性的1對1的關係這是不是我尋找。

有沒有辦法在這種情況下實現這種1對1的可選映射?任何指針都是最有幫助的。

+0

如果回答滿意,請關閉問題。謝謝! :-) – sbglasius

+0

它不起作用。我不認爲1-1可以創建。我可能應該將它關閉爲無法回答? –

回答

3

你可以考慮做類似

class Post { 
    // Other fields 

    Ticket ticket 

    static constraints = { 
    // Other constraints 
    ticket (nullable:true,unique:true, validator: { val, obj -> 
     if(val) { 
     return val.post == obj 
     } 
    }) 
    } 
} 

自定義驗證這是否解決問題了嗎?

+0

嗨,謝謝你的解決方案!它的工作原理(用小編輯完成),比以前的情況要好,因爲現在至少在一端進行驗證。但是,現在仍然有可能在Post中設置正確的票據參數(因爲驗證程序強制執行該參數),但是返回Ticket並更改它指向的Post對象。我只是想知道是否有辦法從兩端強制執行它,但我想這不是嗎? :( –

+0

如何在另一端進行另一種驗證?應該有可能嗎? – sbglasius

+0

現在就試試看 –