Spring 等待索引使用Hibernate搜索和JUnit刷新

Spring 等待索引使用Hibernate搜索和JUnit刷新,spring,hibernate,junit,lucene,hibernate-search,Spring,Hibernate,Junit,Lucene,Hibernate Search,我正在为Hibernate搜索(Lucene)repo编写JUnit测试。在@Before方法中,我持久化一个实体,然后在@Test方法中,我要搜索它。问题是,在运行测试方法时,索引显然没有更新 我的测试类用@Transactional注释。我尝试用@Transactional仅注释@Before方法,但我一定是做错了什么,因为Hibernate Search抱怨索引时缺少会话(尝试访问延迟加载的属性) 我甚至在测试方法开始时尝试了sleep()ing,但没有成功 我尝试在@Before方法中调

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

我的测试类用
@Transactional
注释。我尝试用
@Transactional
仅注释
@Before
方法,但我一定是做错了什么,因为Hibernate Search抱怨索引时缺少会话(尝试访问延迟加载的属性)

我甚至在测试方法开始时尝试了
sleep()
ing,但没有成功


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

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


作为替代方案,FullTextSession有一个flushToIndexes()方法,您可以使用该方法强制立即刷新,但是您没有测试完整的端到端事务行为。此外,如果刷新对索引的更改,事务回滚将不会撤消这些更改,因此,如果您试图使用事务测试来保持它们的独立性,这将是不够的。

这是我尝试过的一件事,但我一直遇到
不允许在共享EntityManager上创建事务的问题-使用Spring事务或EJBCMT代替
问题。我正在使用
@PersistenceContext
注释注入
EntityManager
,然后调用
getTransaction().begin()
…commit()
。很抱歉,我没有使用Spring,所以我无法告诉您配置的具体错误,但我非常确定您的事务配置不正确。顺便说一句,这是Spring的错误,而不是Hibernate的错误,因为Hibernate的错误是完全有效的。