首页 > 解决方案 > 保存在 Controller 中时未调用 GORM 事件(beforeInsert)

问题描述

我有一个简单的 Domain 类,它使用“assigned”作为 id 生成器。这是因为我想根据其他一些参数手动生成 id,并在调用“beforeInsert”事件时通过设置 id 参数来自动化它。问题是由于某种原因,beforeInsert()从控制器将新域对象保存到数据库时永远不会调用它。为什么它不起作用?

PS:我得到的错误是

Caused by: org.springframework.dao.DataIntegrityViolationException: Entity [Testy : (unsaved)] has null identifier when identifier strategy is manual assignment. Assign an appropriate identifier before persisting.

暴躁的领域类:

import grails.mongodb.MongoEntity
import org.bson.types.ObjectId


class Testy implements MongoEntity<Testy> {

    ObjectId id

    Integer i

    static mapping = {
        id generator: "assigned"
        collection "testy"
        database "test"
    }

    static constraints = {
        i nullable: false
    }

    def beforeInsert() {
        id = new ObjectId()
        return true
    }
}

TestyController

package hegardt.backend.grails

import grails.gorm.transactions.Transactional
import org.springframework.http.HttpStatus

class TestyController {

    @Transactional
    def save() {
        Testy instance = new Testy()
        bindData(instance, request.getJSON())

        instance.validate()
        if (instance.hasErrors()) {
            respond instance.errors, view: 'create' // STATUS CODE 422
            return
        }

        instance.insert(flush: true)

        render HttpStatus.OK
    }
}

标签: mongodbgrailsgroovy

解决方案


推荐阅读