等待索引与Hibernate Search和JUnit刷新

时间:2013-10-01 22:13:12

标签: spring hibernate junit lucene hibernate-search

我正在为Hibernate Search(Lucene)repo编写一个JUnit测试。在@Before方法中,我保留一个实体,然后在@Test方法中,我想要搜索它。问题是,在测试方法运行时,索引显然没有更新。

我的测试类注释了@Transactional。我尝试使用@Before仅注释@Transactional方法,但我必须做错事,因为Hibernate Search会在索引时尝试缺少会话(尝试访问延迟加载的属性)。

我甚至在测试方法开始时尝试sleep(),但没有用。

我尝试在Search.getFullTextEntityManager(entityManager).createIndexer().startAndWait()方法中调用@Before,但这似乎永远存在。

1 个答案:

答案 0 :(得分:1)

将测试注释为Transactional并不是一个好主意,因为您可能需要控制事务。 Hibernate Search将在事务提交时刷新对索引的更改:您需要在运行查询之前提交事务。

作为替代 FullTextSession 有一个方法 flushToIndexes(),你可以使用它来强制立即刷新,但是你没有测试完整的端到端事务行为。此外,如果您将更改刷新到索引,则事务回滚将不会撤消它们,因此如果您尝试进行事务测试以使它们保持独立状态,那么它就不会很好。