2011-10-01 23 views
0

Je souhaite utiliser les fonctions de recherche en texte intégral d'Hibernate Search. J'ai une application Java EE simple. Je les classes annotés entité et voici mon persistence.xml:Recherche Hibernate et JPA avec transaction 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> 

Et j'essaie de rechercher cette façon:

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; 

Alors je lui ai donné peut ne pas utiliser un EntityTransaction tout en utilisant JTA. Donc, ma question est comment puis-je utiliser Hibernate Search avec JTA?

Répondre

0

Vous avez configuré la source jta-data (contrairement à la source de données non-jta). Donc, probablement, authorFacade.getEntityManager() renvoie EntityManager qui utilise les transactions JTA. Maintenant, vous avez le gestionnaire d'entité qui joue avec les transactions JTA dans votre main. Vous le passez en argument à getFullTextEntityManager. Ftem.getTransaction(). Begin() passe juste l'appel à votre EntityManager (JTA) d'origine. Vous rencontrez ensuite des problèmes, car getTransaction est supposé être utilisé uniquement lorsque vous utilisez des transactions gérées par une application, et qu'un EntityManager ne joue pas avec deux types de transactions.

Vos options sont:

  1. Si vous êtes satisfait de transactions JTA, il suffit de les utiliser comme vous utilisez les ailleurs. Je ne vois rien de spécial en utilisant eux avec Hibernate Search. Si vous ne connaissez simplement pas les transactions JTA (et que vous ne voulez pas les apprendre maintenant) et que vous voulez à peu près le même comportement de transaction que dans votre code, annoter la méthode du bean avec @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) et supprimer la gestion des transactions de votre code.
  2. Configurez une source de données non-jta et utilisez-la.
+0

Je souhaite utiliser les transactions JTA. Mais comment puis-je utiliser avec Lucene Queries? J'ai besoin de QueryBuilder quand il vient d'EntityManager qui n'est pas FullTextEntityManager. Lorsque j'essaie d'obtenir le fullTextEntityManager, j'obtiens 'Essayer d'utiliser Hibernate Search sans Hibernate EntityManager' . Et je n'ai pas trouvé d'exemple jusqu'ici ... – hcpeter

+0

Alors utilisez-vous une autre implémentation de JPA que Hibernate? Quel serveur d'application? Je peux voir que vous n'avez pas de fournisseur défini dans le fichier persistence.xml, ce sera donc ce qui est par défaut dans votre serveur d'applications. Si vous voulez être sûr que c'est Hibernate, alors vous devez ajouter org.hibernate.ejb.HibernatePersistence comme décrit par exemple ici: http://banana-blog.net/tag/jpa/ –

+0

Non J'utilise hibernate avec glassfish 3.1. Je construis mes requêtes avec javax.persistence.criteria.CriteriaQuery et CriteriaBuilder. – hcpeter

Questions connexes