命令对象内的Grails域对象始终保存

时间:2014-04-22 20:41:48

标签: hibernate grails gorm

我有一个看起来如下的命令对象......

@Validateable
class ACommand implements Serializable
{
  ADomainObject bundleDef
}

我使用表单填充Command然后使用类似于此

的控制器
def save(ACommand command)

我还在Config.groovy

中添加了以下内容
grails.gorm.autoFlush = false

问题是即使我没有刷新(甚至调用.save())它仍然会在返回时保存到数据库中。有没有人经历过这个?有办法吗?

更新

还尝试了以下

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 ...
}

这也不起作用,即使调用了丢弃(我设置了一个断点),它仍然可以保存。

更新2

我改变了我的服务,如下所示

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

似乎在抛出错误后直接保存到DB。我还确认我的服务是交易性的。

更新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
}

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

这就是我设法让它发挥作用的方式......

我首先在服务中根据此qoute

添加了@Transactional(readOnly = true)注释
  

此版本默认为所有读写事务的方法(由于类级别注释),但listBooks方法会覆盖此方法以使用只读事务:

这有所帮助,但现在它不会节省时间。所以我把.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 ...
}

我需要刷新:尽管读取了autoFlush,但我不确定是否存在。