belongsTo可以为空?

时间:2014-02-17 03:07:40

标签: grails gorm

在阅读grails官方指南时,我对belongsTo与多对一关系有疑问。

当我定义两个类时,Face和Nose如下所示:

class Face {

    String name
    Nose nose

    static constraints = {
    }
}


class Nose {

    String color

    static belongsTo = [face: Face]

    static constraints = {
    }
}

我认为我们可以通过两种方式制作Face实例:

  1. 同时用鼻子做脸

    def rudolph = new Face(name: 'Rudolph', nose: new Nose('color': 'Red')).save(failOnError: true)
    
  2. 制作鼻子,按顺序面对

    def nose = new Nose(color: 'Red').save(failOnError: true)
    def rudolph = new Face(name: 'Rudolph', nose: nose).save(failOnError: true)
    
  3. 然而,两者都给我一个错误:

    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属性?

1 个答案:

答案 0 :(得分:0)

  1. 在您定义一对一关系的情况下,您不需要拥有“belongsTo”。你可以从“Nose”类中删除它,它会没事的。除此之外,您不必保存“Nose”实例,只需创建它并将其添加到“Face”并保存“Face”实例。详情:http://grails.org/doc/latest/ref/Domain%20Classes/hasOne.html

  2. 当您拥有一对多或多对多关系时,需要定义“belongsTo”。它与保存和级联删除有关。关于“为什么”问题的链接:http://grails.org/doc/latest/ref/Domain%20Classes/belongsTo.html