Hibernate搜索和JPA与JTA事务

时间:2011-10-01 12:37:45

标签: hibernate java-ee jpa

我想使用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?

1 个答案:

答案 0 :(得分: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 交易(现在不想学习它们)并希望大致相同 现在代码中的事务行为,使用注释bean方法 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)和 从代码中删除事务处理。
  2. 配置非jta-data-source并使用它。