我有一個Spring Boot應用程序,通過JPA批註配置了許多實體。對於特定類型的新實體,我運行幾個查詢來確定是否存在基於日期字段的舊條目。這部分工作正常。但是,我還沒有在目標對象的任何位置調用存儲庫上的save()。雖然選擇的查詢執行我似乎是自動沖水......Spring JPA在調用保存之前自動插入Entity。這怎麼能被阻止?
2014-11-06 12:05:46.617 DEBUG 5070 [clientInboundChannel-10] --- org.hibernate.engine.spi.ActionQueue : Executing identity-insert immediatel
2014-11-06 12:05:52.647 DEBUG 5070 --- [boundChannel-10] org.hibernate.SQL : insert into target_object_table...
2014-11-06 12:05:52.647 DEBUG 5070 [clientInboundChannel-10] --- org.hibernate.SQL : insert into ftarget_object_table...
的問題是,因爲我並沒有提出這項平齊我對象的版本仍具有0因此,一個ID在以後的在@Transaction中指向我調用repository.save(targetObject)並最終以兩個保存在數據庫中。
在研究通過谷歌似乎有兩件事可能會解決這個問題,但我不是100%確定如何配置他們與「春季啓動」/「jpa」。
1)我猜測,因爲我的對象具有@Entity符號,它會自動附加在實例化時間。有沒有簡單的方法來防止這種情況?我必須顯式調用實體管理器上的detach()嗎?
2)是否有一個application.properties設置將刷新模式更改爲提交或註釋@Query上的選項來更改每個查詢級別的提交模式?
我認爲你對交易的理解有問題,需要刷新和保存。在Spring聲明式事務管理中,您幾乎不必調用flush,但在事務邊界結束時(由@Transaction標記 - 考慮父/子方法調用),Spring事務管理將提交事務。沖洗時間往往是不確定的,你不應該知道什麼時候,除了它總是發生在交易結束 – gerrytan 2014-11-06 22:26:03