grails中的set属性方法无法全局更改实例

时间:2015-03-12 09:04:57

标签: grails grails-2.0 grails-domain-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
    }
}

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

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 println上打印为true),但不会# 39; t更改数据库条目。我试图通过instance.save()保存实例,但行为没有变化。

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

1 个答案:

答案 0 :(得分:2)

您在服务的哪个阶段检查数据库中实例的状态?您的实例何时创建?您的方法设置保护变量但不保存实例。

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

save(flush: true, failOnError: false)