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毫秒李>
- 使用每个订单save(),在完成所有操作后,在最后106 485毫秒内刷新一次;速度快了3倍,但仍然很慢
def hibSession=sessionFactory.getCurrentSession()
hibSession.flush()
- 最后,saveAll()和flush()将持续1944毫秒。快15倍
def hibSession=sessionFactory.getCurrentSession()
hibSession.flush()
我想这就是
saveAll
的行为,但我只是想验证一下我的假设。我不知道为什么在运行功能测试时会出现错误(执行geb在运行test run app
时执行的相同步骤不会产生错误)。您是否有可能向我指出saveAll
的源代码?混合到所有域类中的方法调用此:这是混合在其中的方法: