【发布时间】:2015-04-29 06:33:09
【问题描述】:
我正在为我的 Spring Web 应用程序使用 Hibernate(使用 JPA)和 Hibernate Search。 当应用程序在服务器上启动时,我使用以下代码创建索引:
EntityManager em = emf.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
em.close();
这就像一个魅力。但是,当我通过 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 注释进行的。
这里有什么我遗漏的吗?
【问题讨论】:
-
春天你有什么事务管理器?我依稀记得这是一个微妙的问题(因为重新索引发生在事务提交时)。我觉得应该是JPA事务管理器。
-
我正在使用 JPA 事务管理器:javax.persistence.EntityTransaction;
标签: java spring hibernate jpa hibernate-search