2014-04-22 8 views
1

У меня есть командный объект, который выглядит следующим образом ...Grails домена внутри командного объекта всегда сохраняет

@Validateable 
class ACommand implements Serializable 
{ 
    ADomainObject bundleDef 
} 

я использую форму для заполнения команды затем использовать контроллер, подобный этому

def save(ACommand command) 

Я также добавил следующее к моему Config.groovy

grails.gorm.autoFlush = false 

проблема даже когда я не вровень (или даже кал l .save()), он по-прежнему сохраняется в БД по возвращении. Кто-нибудь испытал это? Есть ли способ обойти это?

Update

попытался также следующие

def save(ACommand command) 
{ 
    try{ 
     service.saveADomainObject(command.adomain) //save called in here if no error 
    } 
    catch(Exception e3){ 
     log.error(e3); 
     command.adomain.discard() 
    } 
    // renders ... 
} 

Это также не работает, даже несмотря на то, сбрасывания называется (я поставил точку останова) он все еще сохраняет.

Update 2

Я изменил мою службу выглядеть следующим образом

adomain.discard() 
throw new InvalidObjectException("Blah Blah Blah") 

Это, кажется, сохранить в БД непосредственно после того, как выбрасывается ошибка. Я также подтвердил, что мое обслуживание является транзакционным.

Update 3

Добавление моих классов обслуживания для справки

@Transactional(readOnly = true) 
def saveADomainObject(def adomain, def test) throws InvalidParameterException, InvalidObjectException, Exception{ 
    if (!test) 
    { 
     throw new InvalidParameterException("*") 
    } 
    else 
    { 
     if (adomain?.id) 
     { 
      if (!isValidBundleName(adomain, test)) 
      { 
       //TODO: Make default.cannot.save.message 
       throw new InvalidObjectException("*") 
      } 
      errors = updateDomain(adomain) 
     } 
     else 
     { 
      errors = createNewdomain(adomain) 
     } 

     if (errors) 
     { 
      throw new Exception(errors) 
     } 
    } 
} 
protected def updateDomain(def adomain) 
{ 
    adomain.updatedBy = user 
    String errors=null; 
    if (adomain.getErrors().allErrors.size() > 0) 
    { 
     errors = adomain.getErrors().allErrors.join("\n") 
    } 
    return errors 
} 
private def createNewdomain(def adomain) 
{ 
    adomain.createdBy = user 
    String errors = null 
    if (adomain.getErrors().allErrors.size() > 0) 
    { 
     errors = adomain.getErrors().allErrors.join("\n") 
    } 
    return errors 
} 

ответ

0

Это, как мне удалось заставить его работать ...

Первый в службы I добавлены @Transactional(readOnly = true) аннотации на основе этого qoute

Эта версия по умолчанию всех методов является чтение-запись транзакционных (из-за аннотации на уровне класса), но мет listBooks od переопределяет это для использования транзакции только для чтения:

Это помогло, но теперь это не сэкономит время. Поэтому я Тук в .save() крикнуть сделать мой контроллер выглядеть следующим образом ...

def save(ACommand command) 
{ 
    try{ 
    service.saveADomainObject(command.adomain) //save called in here if no error 
    command.adomain(flush:true) 
    } 
    catch(Exception e3){ 
    log.error(e3); 
    } 
    // renders ... 
} 

мне нужна флеш: истинный, несмотря на readding AutoFlush, так что я не уверен, что там.

1

Если ADomainObject bundleDef привязан к объекту, который уже постоянным (т.е. если связывающий этот объект загружает запись из базы данных), то изменения этого объекта будут автоматически сохранены в БД, когда сеанс Hibernate будет закрыт.

Предполагая, что вы не хотите, чтобы сохранить объект, если ограничения недействительны это сделать:

def save(ACommand command) { 

    if (!command.adomain.save()) { 
     log.error "Failed to save domain due to errors $command.adomin.errors" 
     // other error handling - maybe show a form that allows the user to correct the errors 
    } else { 
     // object saved successfully, redirect to homepage, throw a party, or whatever 
    } 
} 
+0

Я пробовал это, и он не работает Я могу обновить свой код, если это поможет – Jackie

+0

, если вы покажете тело действия контроллера, которое должно помочь –

+0

добавлена ​​запрашиваемая информация, дайте мне знать, если вам нужно больше – Jackie

Смежные вопросы