![](/img/trans.png)
[英]Grails: what does .save(flush:flush, insert:true) do differently from .save(flush:true)
[英]Calling entity.delete(flush: true) in a Spock test does not flush, nor does using withTransaction, one has to run both separately
我有一個帶有 Spock 2.0 測試的 Grails 5.2.5 應用程序。 在其中,我嘗試刪除這樣的實體:
def "experiment"() {
given:
MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
when:
entity.delete()
then:
MyEntity.count() == 0 // fails
}
它失敗。 保存的實體在刪除嘗試后保留在那里。 如果我將entity.delete()
替換為以下三個選項中的任何一個,它仍然會失敗。
MyEntity.withSession {
entity.delete(flush: true, failOnError: true)
}
// OR
MyEntity.withTransaction {
entity.delete(flush: true, failOnError: true)
}
// OR
entity.delete(flush: true, failOnError: true)
或者,如果我刪除failOnError:true
。
我目前基本上無法在 spock 測試期間從數據庫中刪除內容,而我曾經能夠在 Grails 2.x 中執行此操作,因此不確定如何遷移這些測試。
編輯:
我設法像這樣刪除了一個實體,但這對我來說毫無意義,為什么這些應該起作用而上面的不起作用:
def "experiment"() {
given:
MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
when:
entity.delete(flush: true) // here flush is necessary
MyEntity.withTransaction {
entity.delete()
}
then:
MyEntity.count() == 0 // passes
}
令我非常驚訝的是,即使沒有同花順,它也能正常工作,而高於同花順是必要的:
def "experiment"() {
given:
MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
when:
MyEntity.withTransaction {
entity.delete()
}
entity.delete() // here flush is not necessary
then:
MyEntity.count() == 0 // passes
}
這是什么源碼。。
好吧,問題是我只刷新了刪除操作,沒有刷新保存操作。 我認為我不必這樣做,因為保存的實體是在.count()
操作期間找到的。
Hibernate flushMode
將COMMIT
作為默認值,而不是過去的AUTO
。 文檔對此有錯誤,我發布了一個 PR 來修復文檔,更改僅在發行說明中提到,但文檔沒有更新。
由於已經改變,現在我想在測試中保存實體並刪除它們,我需要刷新這兩個操作。
所以這現在可以正常工作了:
def "experiment"() {
given:
MyEntity entity = new MyEntity().save(failOnError: true, flush: true) // flush was added here that wasn't here before
when:
entity.delete(flush: true) // flush needs to be here as well.
then:
MyEntity.count() == 0 // works now
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.