hibernate - Grails 和后台任务

标签 hibernate grails grails-orm executorservice

用户填写一些表格,在其中设置报告生成的参数。他提交表单,服务器验证参数,向用户返回一切正常的消息并生成报告。报告生成完成后,用户会收到带有报告链接的电子邮件。

在 grails 中实现这一目标的正确方法是什么?
目前我有一个生成报告的服务,它看起来像这样:

@Transactional
class AnalyticsService {

    ExecutorService executor = Executors.newSingleThreadExecutor()

    def buildExportAndSendMail() {
        executor.execute {
            //GENERATE REPORT AND SEND MAIL. USES GORM.
        }
    }

    @PreDestroy
    void shutdown() {
        executor.shutdownNow()
    }
}

我的 Controller 操作如下所示:
def generateReport(ReportParams command) {
    if(!command.hasErrors()) {
        analyticsService.buildExportAndSendMail()
        render([success:true, html:"Your report is being generated."] as JSON)
    } else {
        ...
    }
}

但是,服务在尝试访问域对象字段时会引发错误:
Exception in thread "pool-8-thread-1" 
Error |
org.hibernate.LazyInitializationException: could not initialize proxy - no Session

在 grails 中执行此操作的正确方法是什么?

最佳答案

这里的问题是您正在创建一个新线程并且它没有绑定(bind)到 Hibernate session 。创建一个很容易。您使用什么域类并不重要。例如:

def buildExportAndSendMail() {
  executor.execute {
    SomeDomainClass.withNewSession { session ->
      //GENERATE REPORT AND SEND MAIL. USES GORM.
    }
  }
}

您可以阅读有关 withNewSession 的更多信息在 documentation .

关于hibernate - Grails 和后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835754/

相关文章:

java - Spring集成中使用Hibernate触发事件

grails - Grails 3 中一对多域的深层复制

hibernate - 当持久化实例已设置但未更改时,hibernate 会更新数据库吗?

hibernate validator 异常 "No validator could be found for type: java.lang.String."

layout - 在 main.gsp 上显示日期

mysql - 如何将Grails war部署到tomcat

java - 如何在Grails 3中捕获 “org.springframework.web.multipart.MultipartException”

jquery - 在 Grails 应用程序中放置何处以及如何访问 jQuery 插件?

hibernate - 使用 transient 字段在 grails 中查询和排序数据库结果

java - 父/子关系的 Hibernate 注释映射?