Grails / GORM:创建一对一的可选关系

时间:2011-10-07 08:08:58

标签: grails gorm domain-model

我正在设计一个系统,用户之间的帖子/讨论可以升级为门票。在一个特定的地方,我正在尝试创建一对一的可选关系,但遇到了某些问题。下面给出了聚光灯下实体的精简版本。

规则:

  1. 如果需要,帖子可以成为票证。 (可选)
  2. 机票必须有一个帖子。 (强制)
  3. 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. 创建一个帖子,将故障单属性保留为null如果以及何时将帖子升级为故障单
    2. 我可以明确地将Post的故障单属性设置为指向父故障单。
    3. 但是,此映射不会在域级别强制执行。它为Ticket1指向Post1的情况留出了空间,但Post1指向了Ticket2。

      我尝试在 Ticket 类中使用static hasOne = [post: Post],但后来了解到它要求帖子类中存在static belongsTo = [ticket: Ticket]并且这成为强制性的一对一关系,这不是我正在寻找的。

      在这种情况下,有没有办法实现这种1对1可选映射?任何指针都会非常有用。

1 个答案:

答案 0 :(得分: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
       }
    })
  }
}

这会解决您的问题吗?

相关问题