2017-03-17 91 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