【问题标题】:Grails/GORM: creating one-to-one optional relationshipGrails/GORM:创建一对一的可选关系
【发布时间】:2011-12-02 19:57:02
【问题描述】:

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

规则:

  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. 我可以将 Post 的票证属性显式设置为指向父票证。

但是,此映射并未在域级别强制执行。它为 Ticket1 指向 Post1,但 Post1 指向 Ticket2 的情况留出了空间。

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

有没有办法在这种情况下实现这种一对一的可选映射?任何指针都会很有帮助。

【问题讨论】:

  • 请关闭问题,如果它的回答令您满意。谢谢! :-)
  • 它不起作用。我认为无法创建 1-1。我可能应该将其关闭为无法回答?

标签: grails grails-orm domain-model


【解决方案1】:

您可以考虑制作一个自定义验证器,例如

class Post {
  // Other fields

  Ticket ticket

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

这能解决您的问题吗?

【讨论】:

  • 您好,感谢您的解决方案!它可以工作(进行了小的编辑)并且比早期的情况要好,因为现在至少在一端进行了验证。但是,现在仍然有可能我在 Post 中设置了正确的票证参数(因为验证器强制执行它),然后返回票证并更改它指向的 Post 对象。我只是想知道是否有任何方法可以从两端强制执行它,但我想没有? :(
  • 另一端的另一个验证怎么样?应该可以吧?
  • 你是怎么过来的?你有没有机会结束这个问题?
  • 您好,抱歉耽搁了。我尝试在另一端使用验证器,但它会产生冲突,因为其中一个值必须在另一个值之前设置;还在尝试,很快就会告诉你结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多