我想使用Hibernate Search全文搜索功能。我有一个简单的Java EE应用程序。我注释了实体类,这是我的persistence.xml:
<persistence-unit name="library">
<jta-data-source>jdbc/webrarydb</jta-data-source>
<class>net.hcpeter.webrary.entities.Author</class>
<class>net.hcpeter.webrary.entities.Book</class>
<class>net.hcpeter.webrary.entities.Request</class>
<class>net.hcpeter.webrary.entities.User</class>
<properties>
<property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
<property name="hibernate.search.indexing_strategy" value="manual"/>
<property name="hibernate.search.default.indexBase" value="/Users/hcpeter/Documents/workspace/indexes"/>
<property name="hibernate.current_session_context_class" value="org.hibernate.context.JTASessionContext"/>
</properties>
</persistence-unit>
我试着这样搜索:
EntityManager em = authorFacade.getEntityManager();
FullTextEntityManager ftem = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
ftem.getTransaction().begin();
QueryBuilder qb = ftem.getSearchFactory().buildQueryBuilder().forEntity(Author.class).get();
org.apache.lucene.search.Query query = qb.keyword().onFields("firsName", "lastName").matching("Author#1").createQuery();
javax.persistence.Query persistenceQuery = ftem.createFullTextQuery(query, Author.class);
List<Author> result = persistenceQuery.getResultList();
em.getTransaction().commit();
em.close();
for (Author author : result) {
System.out.println(author.getLastName() + " " + author.getFirstName());
}
return result;
然后我给了在使用JTA时不能使用EntityTransaction。 所以我的问题是如何在JTA中使用hibernate Search?
答案 0 :(得分:0)
您配置了jta-data-source(与非jta-data-source相比)。所以很可能authorFacade.getEntityManager()返回使用JTA事务的EntityManager。现在你有了实体经理,可以在你的手中玩JTA交易。您将它作为参数传递给getFullTextEntityManager。可能ftem.getTransaction()。begin() 只是将调用传递给您的原始(JTA)EntityManager。然后你遇到了问题,因为只有在使用应用程序管理的事务时才会使用getTransaction,并且一个EntityManager不会使用两种类型的事务。
您的选择是: