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

Grails/GORM:创建一对一可选关系,grails,gorm,domain-model,Grails,Gorm,Domain Model,我正在设计一个系统,用户之间的帖子/讨论可以升级为票证。在某个特定的地方,我试图创建一对一的可选关系,但遇到了某些问题。聚光灯中实体的浓缩版本如下所示 规则: 如果需要,一个帖子可以成为一张票。(可选) 票必须有邮递。(强制性) Post.groovy class Post { String title String description String postedBy Ticket ticket stati

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

规则:

  • 如果需要,一个帖子可以成为一张票。(可选)
  • 票必须有邮递。(强制性)
  • 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)
        }
    }
    
    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)
            }
    
    }
    
    票证。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)
        }
    }
    
    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)
            }
    
    }
    
    这在某种程度上是可行的。我可以:

  • 如果帖子升级为票证,则创建一篇帖子,并将票证属性保留为null
  • 我可以显式地将Post的ticket属性设置为指向父ticket
  • 但是,此映射不是在域级别强制执行的。它为Ticket1指向Post1而Post1指向Ticket2的情况留下了空间

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


    在这种情况下,有没有办法实现这种1对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对象。我只是想知道是否有任何方法可以从两端强制执行,但我想没有(在另一端进行另一次验证如何?应该是可能的?您是如何进行的?是否有可能结束此问题?您好,很抱歉延迟。我尝试在另一端使用验证程序,但它会产生冲突,因为必须先设置一个值,然后再设置另一个值;如果继续尝试,将很快让您知道结果。请谅解。)请回答这个问题,如果它的回答令您满意。谢谢!:-)它不起作用。我认为1-1不可能被创造出来。我可能应该关闭它,因为无法回答?