2017-03-17 74 views
0

我目前正在編寫測試,並且我無法理解爲什麼我在存儲庫上調用findOne方法時沒有得到正確的實體。新的saveAndFlush調用後保存虛假實體的java spring實體管理器

我的測試設置是這樣工作的

  • 父= ParentRepository.saveAndFlush(父);
  • child.setParent(parent);
  • child = ChildRepostiroy.saveAndFlush(child);

現在呼籲

parentRepository.findOne(parent.getId()); 

時,會返回正確的父,但它不會(還)有孩子的連接。子關係爲空。然而,當撥打電話

entityManager.clear(); 

在findOne之前它將按預期工作。我認爲entitymanager能夠在不清除它的情況下識別更改。至少findOne方法應該使緩存無效,不是嗎?

我正在使用hibrenate-jpa-2.1。對於我使用JpaRepositoryAndSpecificationExecutor接口的存儲庫。

的測試與以下注釋

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest 
@ActiveProfiles(profiles = "test") 
@Transactional 

回答

0

運行這是我的理解是Hibernate使用引用的遲緩裝載期間查詢操作,以避免加載太多的數據。

您可以啓用急切加載來克服此問題或使用getter方法實際加載引用。

https://howtoprogramwithjava.com/hibernate-eager-vs-lazy-fetch-type/

FetchType.LAZY =除非明確 「提出要」通過getter FetchType.EAGER =負載的所有關係

+0

渴望加載definitly不是一個解決方案不加載的關係。它的目的很懶,它最初並不是問題,因爲它可以通過代理對象加載關係。 除此之外,它調用entitymanager.clear()後應該已經加載本身並不是問題。 EntityManager似乎將實體保存在緩存中,並簡單地返回引用。但是,引用不等於從數據庫中讀取時會得到的結果。 –

+0

對,我誤解了它會出現的點。對於那個很抱歉。然後,正如你所說,findOne正在信任緩存,而不是清除它會apperar。閱讀findOne的文檔,http://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html?is-external=true#findOne( ID),沒有提及findOne使緩存無效。它可能不應該,如果你打算去檢查數據庫以查看緩存中的值是否在每個查找查詢中是最新的 – Edd

相關問題