2011-10-01 58 views
0

我想使用Hibernate搜索全文搜索功能。我有一個簡單的Java EE應用程序。我註釋的實體類,這裏是我的persistence.xml:Hibernate搜索和JPA與JTA事務

<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。 所以我的問題是如何使用HTA搜索與JTA?

回答

0

您已經配置了jta-data-source(與非jta-data-source對比)。所以最有可能的authorFacade.getEntityManager()返回使用JTA事務的EntityManager。現在你有掌握JTA交易的實體經理。您將它作爲getFullTextEntityManager的參數傳遞。可能ftem.getTransaction()。begin() 只是將調用傳遞給您的原始(JTA)EntityManager。那麼你遇到了問題,因爲getTransaction應該只在你使用應用程序管理的事務時使用,並且一個EntityManager不能使用兩種類型的事務。

的選項有:

  1. 如果你是幸福的JTA事務,因爲你使用 他們只是在其他地方使用它們。 Hibernate Search使用 他們看不到什麼特別的東西。如果您僅僅不知道JTA 事務(現在不想了解它們)並且想要現在與代碼中的事務行爲相同,請使用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)和 註釋bean方法刪除事務處理從你的代碼。
  2. 配置非jta數據源並使用它。
+0

我想使用JTA事務。但是,我如何使用lucene查詢?當EntityManager來自非FullTextEntityManager時,我需要QueryBuilder。當我嘗試獲取fullTextEntityManager時,我得到了'試圖在沒有Hibernate EntityManager的情況下使用Hibernate Search' 。到目前爲止我還沒有找到一個例子...... – hcpeter

+0

那麼您是否使用了比Hibernate更多的其他JPA實現?哪個應用服務器?我可以看到你沒有在persistence.xml中定義提供者,所以它將成爲應用服務器中默認的東西。如果你想確定它是Hibernate,那麼你必須添加 org.hibernate.ejb.HibernatePersistence,如在此處所述:http://banana-blog.net/tag/jpa/ –

+0

不,我使用hibernate與玻璃魚3.1。我使用javax.persistence.criteria.CriteriaQuery和CriteriaBuilder構建了我的查詢。 – hcpeter