在阅读grails官方指南时,我对belongsTo与多对一关系有疑问。
当我定义两个类时,Face和Nose如下所示:
class Face {
String name
Nose nose
static constraints = {
}
}
class Nose {
String color
static belongsTo = [face: Face]
static constraints = {
}
}
我认为我们可以通过两种方式制作Face实例:
同时用鼻子做脸
def rudolph = new Face(name: 'Rudolph', nose: new Nose('color': 'Red')).save(failOnError: true)
制作鼻子,按顺序面对
def nose = new Nose(color: 'Red').save(failOnError: true)
def rudolph = new Face(name: 'Rudolph', nose: nose).save(failOnError: true)
然而,两者都给我一个错误:
Fatal error running tests: Validation Error(s) occurred during save():
- Field error in object 'relationship.Nose' on field 'face': rejected value [null]; codes
当然,如果我把约束放在Nose中,它就可以了:
class Nose {
String color
static belongsTo = [face: Face]
static constraints = {
face nullable: true
}
}
我不确定后引用属性是否必须始终可以为空。
另一个问题是以下静态属性有效,因为它没有“face”属性:
static belongsTo = Face
如果它没有后引用属性名,为什么要定义belongsTo属性?
答案 0 :(得分:0)
在您定义一对一关系的情况下,您不需要拥有“belongsTo”。你可以从“Nose”类中删除它,它会没事的。除此之外,您不必保存“Nose”实例,只需创建它并将其添加到“Face”并保存“Face”实例。详情:http://grails.org/doc/latest/ref/Domain%20Classes/hasOne.html
当您拥有一对多或多对多关系时,需要定义“belongsTo”。它与保存和级联删除有关。关于“为什么”问题的链接:http://grails.org/doc/latest/ref/Domain%20Classes/belongsTo.html