我正在使用Spring(与JPA一起使用)和Hibernate Search作为Spring Web应用程序。当应用程序在服务器上启动时,我使用以下代码创建索引:
EntityManager em = emf.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
em.close();
就像魅力一样。但是,当我通过Hibernate插入新实体时,索引不会被修改为包含新实体。根据Hibernate文档;这应该是自动发生的。
这是我插入实体的方式:
EntityTransaction tx = null;
EntityManager em = emf.createEntityManager();
try {
tx = em.getTransaction();
tx.begin();
em.persist(account);
em.flush();
tx.commit();
}
catch (RuntimeException e) {
if ( tx != null && tx.isActive() ) tx.rollback();
return null;
}
这就是我使用Hibernate Search的方式:
EntityManager em = emf.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
em.getTransaction().begin();
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(AccountPojo.class).get();
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields("id", "user.email", "user.firstName", "user.lastName", "user.phoneNumber", "user.streetAddress")
.matching(term)
.createQuery();
// wrap Lucene query in a javax.persistence.Query
org.hibernate.search.jpa.FullTextQuery jpaQuery =
fullTextEntityManager.createFullTextQuery(luceneQuery, AccountPojo.class);
jpaQuery.setProjection(FullTextQuery.SCORE, FullTextQuery.THIS, "id", "user.email", "user.firstName", "user.lastName", "user.phoneNumber");
// execute search
List result = jpaQuery.getResultList();
em.getTransaction().commit();
em.close();
return result;
当我插入帐户时,在重新启动应用程序之前无法搜索(建立索引)。如我所说,该配置是通过JPA注释进行的。
我在这里想念什么吗?
事实证明,此答案的解决方案非常简单。在上面的示例中,我正在保存一个帐户,然后尝试通过相关实体(User)上的某些属性对其进行搜索。当您保留其中一个查询中包含的具有相关实体的对象时,您需要执行以下操作:
em.refresh(account)
坚持下去之后。否则,将不会重建相关实体的索引,因此您将无法通过实体实体的属性来查找新实体。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句