Hibernate поиск и JPA с транзакцией JTA - PullRequest
0 голосов
/ 01 октября 2011

Я хочу использовать возможности полнотекстового поиска 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;

Затем я дал Не могу использовать EntityTransaction при использовании JTA.Итак, мой вопрос, как я могу использовать Hibernate Search с JTA?

1 Ответ

0 голосов
/ 01 октября 2011

У вас настроен источник данных jta (в отличие от источника данных не-jta).Поэтому, скорее всего, authorFacade.getEntityManager () возвращает EntityManager, использующий JTA-транзакции.Теперь у вас есть менеджер сущностей, который играет с транзакциями JTA в вашей руке.Вы передаете его в качестве аргумента getFullTextEntityManager.Вероятно, ftem.getTransaction (). Begin () просто передает вызов вашему исходному (JTA) EntityManager.Тогда у вас возникнут проблемы, поскольку предполагается, что getTransaction будет использоваться только при использовании управляемых приложением транзакций, а один EntityManager не будет работать с двумя типами транзакций.

Ваши варианты:

  1. Если вы довольны транзакциями JTA, просто используйте их, как и в других местах.Я не вижу ничего особенного в использовании их с Hibernate Search.Если вы просто не знаете транзакции JTA (и не хотите изучать их сейчас) и хотите, чтобы поведение транзакции было таким же, как в вашем коде сейчас, аннотируйте метод bean с помощью @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) и удалите обработку транзакций из своего кода.
  2. Сконфигурируйте non-jta-data-source и используйте его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...