【问题标题】:Saving associated domain classes in Grails在 Grails 中保存关联的域类
【发布时间】:2010-11-05 17:36:07
【问题描述】:

我正在努力在 Grails 上建立关联。假设我有两个域类:

class Engine {
    String name
    int numberOfCylinders = 4
    static constraints = {
        name(blank:false, nullable:false)
        numberOfCylinders(range:4..8)
    }
}

class Car {
    int year
    String brand
    Engine engine = new Engine(name:"Default Engine")
    static constraints = {
        engine(nullable:false)
        brand(blank:false, nullable:false)
        year(nullable:false)
    }
}

这个想法是,用户可以在不首先创建引擎的情况下创建汽车,并且这些汽车会获得默认引擎。在 CarController 我有:

def save = {
    def car = new Car(params)
    if(!car.hasErrors() && car.save()){
        flash.message = "Car saved"
        redirect(action:index)
    }else{
        render(view:'create', model:[car:car])
    }
}

在尝试保存时,我在 Car.engine 字段上得到一个空值异常,因此显然没有创建和保存默认引擎。我尝试手动创建引擎:

def save = {
    def car = new Car(params)
    car.engine = new Engine(name: "Default Engine")
    if(!car.hasErrors() && car.save()){
        flash.message = "Car saved"
        redirect(action:index)
    }else{
        render(view:'create', model:[car:car])
    }
}

也没有用。 Grails 不能保存关联的类吗?我怎样才能实现这样的功能?

【问题讨论】:

  • 可以通过域类指定默认吗???我正在考虑按照您上面所做的方式进行初始化,但可能不是通过控制器。

标签: grails groovy aggregation


【解决方案1】:

我认为您的引擎中需要一个 belongsTo 即

static belongsTo = [car:Car]

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    为了什么值得,我终于搞定了。

    我在尝试拯救汽车时遇到的异常是

    not-null 属性引用 null 或 瞬态值

    很明显,在尝试保存时引擎为空,但为什么呢?原来你必须这样做:

    def car = new Car(params)
    car.engine = new Engine(name: "Default Engine")
    car.engine.save()
    

    由于引擎不属于汽车,因此您不会获得级联保存/更新/删除,这在我的情况下很好。解决方法是手动保存引擎,然后保存汽车。

    【讨论】:

    • 我们不能像这样使用级联映射行为吗:静态映射 = { engine cascade: 'all-delete-orphan' }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多