我正在设计一个系统,其中用户之间的帖子/讨论可以升级为票证。在一个特定的地方,我试图创建一对一的可选关系,但遇到了某些问题。下面给出了聚光灯中实体的精简版本。
规则:
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)
}
}
票务.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)
}
}
这在某种程度上有效。我可以:
但是,此映射不会在域级别强制执行。它为 Ticket1 指向 Post1 而 Post1 指向 Ticket2 的情况留有余地。
我尝试使用
static hasOne = [post: Post]
在 票务 类,但后来了解到它要求存在 static belongsTo = [ticket: Ticket]
在 发帖 类,这成为强制性的 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
}
})
}
}
这会解决你的问题吗?
关于Grails/GORM : creating one-to-one optional relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684591/