2015-03-12 4 views
0

У меня есть домен класс 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 экземпляра. Способ folows

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 
} 

Когда я попытался изменить статус схемы TEST_SCHEMA_1 по setProtect(true) вызова, она изменяется в локальном виде (печатает истинна на станд println), но не меняется в базе данных запись. Я попытался сохранить экземпляр на instance.save() bu без изменений в поведении.

Я использую grails 2.4.4 сейчас. Раньше я использовал версию 2.2.4 и работал, как ожидалось. У меня есть эта проблема, когда я перенес приложение в версию 2.4.4. Что может быть причиной и как это можно решить.

ответ

2

В какой момент службы вы проверяете состояние экземпляра в базе данных? Когда создается ваш экземпляр? Ваш метод устанавливает переменную защиты, но не сохраняет экземпляр.

Если вы вызываете save(), то экземпляр фактически не сохраняется в db, он сохраняется только в БД при очистке сеанса. Попробуйте использовать:

save(flush: true, failOnError: false) 
+0

Первоначально я пробовал использовать save '(failOnError: true)'. Исключены исключения проверки. Я не понял документацию для опции «flush». Но все равно это сработало. – Syam

+1

OK - 'flush()' просто означает принудительно записать в базу данных. Если вы не укажете это, ваше обновление будет записано в БД, но не обязательно сразу. Действительно хорошее объяснение здесь: http://spring.io/blog/2010/06/23/gorm-gotchas-part-1/ Также посмотрите также на части 2 и 3 серии блога. – John