2013-02-02 48 views
0

我正在创建一个带有几个域类和控制器的新grails应用程序。我所有的控制器都有save(),update()和list()等工作方法。save(flush:true)不会刷新会话

def update(Long id, Long version) { 
    def crawlerConfigInstance = CrawlerConfig.get(id) 
    if (!crawlerConfigInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), id]) 
     redirect(action: "list") 
     return 
    } 

    if (version != null) { 
     if (crawlerConfigInstance.version > version) { 
      crawlerConfigInstance.errors.rejectValue("version", "default.optimistic.locking.failure", 
        [message(code: 'crawlerConfig.label', default: 'CrawlerConfig')] as Object[], 
        "Another user has updated this CrawlerConfig while you were editing") 
      render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance]) 
      return 
     } 
    } 

    crawlerConfigInstance.properties = params 

    if (!crawlerConfigInstance.save(flush: true)) { 
     render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance]) 
     return 
    } 

    flash.message = message(code: 'default.updated.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), crawlerConfigInstance.id]) 
    redirect(action: "show", id: crawlerConfigInstance.id) 
} 

这实际上是由IDE

然而,现在,我将应通过域对象的列表运行,并相应地更新它们的附加控制器的方法自动生成的/脚手架方法。获取列表,更改属性和验证是成功的。

save(flush:true)不会抛出任何错误并按预期返回更新的域对象。但是,检查休眠SQL语句,我看到的只有SELECTS,没有更新。事实上,如果我在save()之后直接调用域对象上的delete(),我会在域对象上得到一个并发事务异常。

我控制器的方法看起来像

def doSomething() {  

    def results = CrawlerConfig.findAll(bQ) 

    results.each { crawlerConfigInstance -> 

      crawlerConfigInstance.needsReview = true 

      if (!crawlerConfigInstance.save(flush: true)) { 
       render(view: "show", model: [crawlerConfigInstance: crawlerConfigInstance]) 
       return 
      } 
    } 

    redirect(action: "list") 
} 

非常简单。如果我检查脏字段,needsReview在save()之前标记为脏。 save()更新对象上的版本。

我目前仍然使用h2:mem作为数据库。

对我来说,它看起来像交易没有完成。但我不明白为什么或如何才能完成。 POST之后

THX提前

编辑从的Ondrej

创建一个服务(其被注入并要求罚款)

package lizard 

进口org.springframework.transaction.annotation.Transactional

@Transactional class CrawlerConfigPersist enceService {

static transactional = true 

def checkRequirementsForCrawlerConfigList(String query) { 

    def results = CrawlerConfig.findAll(query) 

    results.each { crawlerConfigInstance -> 

     crawlerConfigInstance.needsReview = true 

     if (!crawlerConfigInstance.save(flush: true)) { 
      println crawlerConfigInstance.errors.getAllErrors() 
      return 
     } 

    } 
} 
} 

但这会导致完全一样的行为,一切正常,除了有上调休眠

+0

我忘了提及的东西:我使用的是当前grails 2.1.1,即使在Controller作品中创建新的对象,但不更新现有的对象。 –

+0

当你强行调用session.flush()时会发生什么?你看到数据库写入或其他一些错误弹出? – Raphael

+0

什么也没有。当我调用executeUpdate()时,它会被强制写入。但从来没有当我打电话保存。我甚至试图在hibernate会话mysqlf上打开一个事务,这个事务失败了。 –

回答

0

移动你的方法保存(),更新()和列表(无更新语句)从控制器到服务。在做这件事之前,看看这里并阅读服务章节:http://grails.org/doc/latest/guide/services.html

+0

理解,但为什么它为我的save(),update()和list()方法工作,但不适用于新创建的方法。这些也不是封装在服务中,如自动生成的。 –

+0

我遵循了Ondrej的提示(thx),这导致了服务(更新后的原始文章)。但是,该服务具有完全相同的行为,不会调用任何更新语句 –

+0

您可以尝试更改DataSource。groovy:将dbCreate更改为开发环境的“更新”。 然后,尝试将failOnError:true作为参数添加到save方法。 –