在“上执行操作”;“有很多”;对象将其插入grails中的新项时

在“上执行操作”;“有很多”;对象将其插入grails中的新项时,grails,groovy,controller,has-many,Grails,Groovy,Controller,Has Many,我是Grails的新手,我正在创建我的第一个应用程序,我发现事情发生在哪里有点困难,所以,我有一个对象“cicle”,它有许多“测量”,每次我创建一个新的“测量”,它是由测量控制器创建的,不同的机器,这发生在同一台机器上,cicle的一些属性会发生变化,因此,我在cicle中执行了一个名为updateCalculations的方法,该方法需要新创建的度量的数据 因此,在measurementController中,我试图使用cycle中的测量值执行一些操作,但我得到了一个空指针异常,我猜cicl

我是Grails的新手,我正在创建我的第一个应用程序,我发现事情发生在哪里有点困难,所以,我有一个对象“cicle”,它有许多“测量”,每次我创建一个新的“测量”,它是由测量控制器创建的,不同的机器,这发生在同一台机器上,cicle的一些属性会发生变化,因此,我在cicle中执行了一个名为updateCalculations的方法,该方法需要新创建的度量的数据

因此,在measurementController中,我试图使用cycle中的测量值执行一些操作,但我得到了一个空指针异常,我猜cicle没有创建,所以我在插入测量对象后将操作移到了方法中,我认为该方法更好,但我也遇到了同样的问题,我甚至认为cicle是创建的,有些是如何初始化的,我不知道到底发生了什么,所以你能帮我吗

这是我的代码:

测量

class Measurement{

String machine
int time1
int time2
int time3
int cicleValue

static belongsTo = [cicle: Cicle]

static constraints = {
    machine blank:false 
    time1 nullable:false 
    time1 min:0 
    time2 nullable:false
    time2 min:0
    time3 nullable:false
    time3 min:0
    cicleValue nullable:false
    cicleValue min:0  
}

def afterInsert(){
    this.cicle.updateCalculations()
}

public void updateCicleValue(){
    double avgTime = (time1 + time2 + time3)/3
    cicleValue = 30 * 24 * 60 * 60 / avgTime
}
}
Cicle.groovy

class Cicle {

String machine
int cicleValue

static hasMany = [measurements:Measurement]

static constraints = {
    machine blank:false 
    cicleValue nullable:false 
}

public void updateCalculations(){

    int sumCicles = 0

    measurements.each{ measurement ->
        sumCicles += measurement.cicleValue
    }

    cicleValue = sumCicles / measurements.size()
    this.save(failOnError: true) 
}
}
groovy测量控制器

@Transactional(readOnly = true)
class MeasurementController {

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

def create() {
    respond new Measurement(params)
}

@Transactional
def save(Measurement measurementInstance) {
if (measurementInstance == null) {
        notFound()
        return
    }

measurementInstance.updateCicleValue()

    Cicle cicle = Cicle.findByMachine(measurementInstance.machine)

    if(cicle == null){
        cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
        cicle.save flush: true
    } 

    measurementInstance.cicle = cicle

    measurementInstance.validate()

    if (measurementInstance.hasErrors()) {
        respond measurementInstance.errors, view:'create'
        return
    }

    measurementInstance.save flush:true
    cicle.measurements << measurementInstance
    cicle.save flush: true

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.created.message', args: [message(code: 'measurementInstance.label', default: 'Measurement'), measurementInstance.id])
            redirect measurementInstance
        }
        '*' { respond measurementInstance, [status: CREATED] }
    }
}

protected void notFound() {
    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'measurementInstance.label', default: 'Measurement'), params.id])
            redirect action: "index", method: "GET"
        }
        '*'{ render status: NOT_FOUND }
    }
}
}
它在afterUpdate方法中停止,告知度量值为null

任何帮助都会很好


谢谢

这是因为您忘记将
measurementstance
添加到
cicle.measurements
。 请尝试在此处保存
cicle
实例时添加它:

 if(cicle == null){
        cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
        cicle.addToMeasurements(measurementInstance)    //add to collection
        cicle.save flush: true
    }

您似乎在某些地方引用了
Ciclo
,而在其他地方引用了
Cicle
。。。这些应该是同一件事吗?是的,它们是,我从西班牙语中搜索了代码,现在一切都被更正了。你能发布你的堆栈跟踪吗?是的,当然,我上传了控制台中发生的事情HI tks!我试着用cicle来做。测量leftshift运算符并没有过载,它不应该这样做。对于这种情况,有一些特别的动态方法。顺便说一句,你能投票支持我的回答吗?我只需要再多投4分就可以得到其他答案:)
 if(cicle == null){
        cicle = new Cicle(machine: measurementInstance.machine, cicleValue: measurementInstance.cicleValue)
        cicle.addToMeasurements(measurementInstance)    //add to collection
        cicle.save flush: true
    }