Grails 中的 Set 属性 方法无法全局更改实例

Set property method in grails could not change the instance globally

我有一个域 class DbUserSchemaServer 有一个瞬态 属性 unassign

class DbUserSchemaServer {
    static transients = ["unassign"]

    DbUser user
    String schema
    DbServer server
    BigInteger objects
    Date creationDate
    String schemaStatus //for dropping
    Boolean protect

    //Transients
    Boolean unassign

    static constraints = {
        user unique:false, nullable: false, blank:false
        schema unique:'server', nullable: false, blank:false
        server unique: false, nullable: false, blank:false
        objects blank:false, nullable:false
        creationDate blank:false, nullable:false
        schemaStatus nullable:true, blank: false
    }

    static mapping = {
        protect defaultValue: false
        unassign defaultValue: false
    }
}

在一项服务中,我试图更改 DbUserSchemaServer 实例的 protect 属性 的值。方法如下

public Boolean protectSchema(DbUserSchemaServer usrSchSrvInst) {
    println "protectSchema: "+usrSchSrvInst.schema
    if(!usrSchSrvInst.protect) { // If unprotected
        if(usrSchSrvInst.schemaStatus.equals("drop")) // If schema status is drop
            usrSchSrvInst.setSchemaStatus(null)
        usrSchSrvInst.setProtect(true)
        println "-->"+usrSchSrvInst.getProtect()
        return true
    }
    else {  // If already protected
        return true
    }

    return false
}

当我尝试通过 setProtect(true) 调用更改模式 TEST_SCHEMA_1 的状态时,它在本地视图中发生变化(在 std [ 上打印 true =18=]), 但在数据库条目中没有改变。我试图通过 instance.save() 保存实例,但行为没有改变。

我现在使用的是 grails 2.4.4。以前,我使用的是 2.2.4 版本,它按预期工作。我将应用程序迁移到 2.4.4 版时遇到了这个问题。可能是什么原因,如何解决。

您在服务中的什么时候检查数据库中实例的状态?你的实例是什么时候创建的?您的方法设置了保护变量但不保存实例。

如果您调用 save(),则该实例实际上并未保存到数据库中,它仅在刷新会话时才保存到数据库中。尝试使用:

save(flush: true, failOnError: false)