Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 有关于“saveAll”的文档吗?_Hibernate_Grails_Gorm - Fatal编程技术网

Hibernate 有关于“saveAll”的文档吗?

Hibernate 有关于“saveAll”的文档吗?,hibernate,grails,gorm,Hibernate,Grails,Gorm,我遇到了如下一些Grails代码: Book.saveAll(bookList) 其中bookList是Book域实例的List。虽然在运行应用程序时(保存所有书籍实例),这似乎工作正常,但功能测试失败,出现以下错误: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' ma

我遇到了如下一些
Grails
代码:

Book.saveAll(bookList)
其中
bookList
Book
域实例的
List
。虽然在运行应用程序时(保存所有
书籍
实例),这似乎工作正常,但功能测试失败,出现以下错误:

Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

然后我想看一些关于
saveAll
的文档,但我似乎找不到任何文档。有文件吗?甚至应该使用这种方法吗?

我不确定为什么没有记录下来,但文档中有相当多的空白:)尽管实现非常基本,它只是在列表中循环并在每个列表上调用
save
。所以你可以把它转换成你自己的循环,它应该在两种情况下都能工作,例如

for (book in bookList) {
   book.save()
}

这样做的好处是,您可以检查循环中每个循环的错误,而且更明显的是,正在保存多个内容,这应该在一个事务中完成。

基本上,saveAll不会刷新。在使用saveAll之后,如果希望立即在数据库中进行更改,可以获取当前会话并刷新它。 Hibernate就是这样工作的:当您调用flush时,它将刷新Hibernate会话,将会话中的所有数据立即持久化到数据库中。如果不使用(flush:true),则数据仅记录在Hibernate会话中,并且仅在刷新Hibernate会话时才会持久化到数据库中。刷新会话的时间由Hibernate自动确定,以优化性能。 有不同的刷新方式,您可以保存所有数据并最终刷新

def hibSession = sessionFactory.getCurrentSession()

hibSession.flush()
我们面临同样的问题。测试哪种方法更快。测试共有300个项目

  • 每次保存图书时。(flush:true,failOnError:true)需要328517毫秒
列出每个{ Book.save(flush:true,failOnError:true) }

  • 使用每个订单save(),在完成所有操作后,在最后106 485毫秒内刷新一次;速度快了3倍,但仍然很慢
list.each{Book.save()}
def hibSession=sessionFactory.getCurrentSession()
hibSession.flush()

  • 最后,saveAll()和flush()将持续1944毫秒。快15倍
Book.saveAll(列表)
def hibSession=sessionFactory.getCurrentSession()
hibSession.flush()


我想这就是
saveAll
的行为,但我只是想验证一下我的假设。我不知道为什么在运行功能测试时会出现错误(执行geb在运行
test run app
时执行的相同步骤不会产生错误)。您是否有可能向我指出
saveAll
的源代码?混合到所有域类中的方法调用此:这是混合在其中的方法: