Hibernate with infinispan tutorial for beginners

This tutorial is for developers who are just beginning to learn hibernate-search and trying to setup a demo project. Most of the codes are copied from hibernate-search documentation: https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/

What we need:

  • eclipse-neon
  • hibernate-search 5.7.0
  • wildfly 10.1.0.Final
  • infinispan 8.2.6 (infinispan-as-embedded-modules-8.2.6.Final.zip), download this from infinispan website and extract in your wildfly modules folder - do not forget to do this otherwise you'll have a missing class exception
Note:
I created my project using javaee7 maven archetype.

Since hibernate-search has already explained a lot we will just take note of the most important pieces:
  1. persistence.xml
    <!-- optional -->
    <property name="hibernate.search.default.directory_provider"
     value="infinispan" />
    <property name="hibernate.search.infinispan.cache_jndiname"
     value="java:jboss/infinispan/broodcampHibernateSearch" />
    <!-- <property name="hibernate.search.default.directory_provider" -->
    <!-- value="filesystem" /> -->
    <property name="hibernate.search.default.indexBase" value="c:/temp/lucene/indexes" />

    In here we set the directory_provider to infinispan, then we also set the cache jndi name. So in wildfly's standalone.xml we must add the cache below:
    <cache-container name="broodcamp" default-cache="broodcamp-hibernate-search">
     <local-cache name="broodcamp-hibernate-search" jndi-name="java:jboss/infinispan/broodcampHibernateSearch">
      <file-store path="c:/temp/lucene/indexes" passivation="true" purge="false"/>
     </local-cache>
    </cache-container>
  2. Create a class Author and Book from hibernate search documentation.
  3. In our pom we must define the following dependencies:
    <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-search-orm</artifactId>
    </dependency>
    
    <dependency>
     <groupId>org.infinispan</groupId>
     <artifactId>infinispan-directory-provider</artifactId>
     <version>8.2.4.Final</version>
     <scope>provided</scope>
    </dependency>
    
  4. Now let's create an arquillian test:
    1. arquillian.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <arquillian xmlns="http://jboss.org/schema/arquillian"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://jboss.org/schema/arquillian
              http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
      
       <defaultProtocol type="Servlet 3.0" />
      
       <container qualifier="wildfly" default="true">
        <configuration>
         <property name="jbossHome">C:\Java\jboss\wildfly-10.1.0.Final</property>
        </configuration>
       </container>
      
       <engine>
        <property name="deploymentExportPath">target/deployments</property>
       </engine>
      
      </arquillian>
      
      Set jbossHome to the correct value.
    2. Create our arquillian test class:
      /*
       * JBoss, Home of Professional Open Source
       * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
       * contributors by the @authors tag. See the copyright.txt in the
       * distribution for a full listing of individual contributors.
       *
       * Licensed under the Apache License, Version 2.0 (the "License");
       * you may not use this file except in compliance with the License.
       * You may obtain a copy of the License at
       * http://www.apache.org/licenses/LICENSE-2.0
       * Unless required by applicable law or agreed to in writing, software
       * distributed under the License is distributed on an "AS IS" BASIS,
       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       * See the License for the specific language governing permissions and
       * limitations under the License.
       */
      package com.broodcamp.hibernatesearch;
      
      import static org.junit.Assert.assertEquals;
      
      import java.util.List;
      import java.util.logging.Logger;
      
      import javax.inject.Inject;
      import javax.persistence.EntityManager;
      
      import org.hibernate.search.jpa.FullTextEntityManager;
      import org.hibernate.search.jpa.Search;
      import org.hibernate.search.query.dsl.QueryBuilder;
      import org.jboss.arquillian.container.test.api.Deployment;
      import org.jboss.arquillian.junit.Arquillian;
      import org.jboss.shrinkwrap.api.Archive;
      import org.jboss.shrinkwrap.api.ShrinkWrap;
      import org.jboss.shrinkwrap.api.asset.EmptyAsset;
      import org.jboss.shrinkwrap.api.spec.WebArchive;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      
      @RunWith(Arquillian.class)
      public class HibernateSearchTest {
      
       private Logger log = Logger.getLogger(this.getClass().getName());
      
       @Inject
       private EntityManager em;
      
       @Deployment
       public static Archive<?> createTestArchive() {
        return ShrinkWrap.create(WebArchive.class, "test.war")
          .addClasses(Author.class, Book.class, Resources.class, StartupListener.class)
          .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml")
          .addAsResource("import.sql", "import.sql").addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
          // Deploy our test datasource
          .addAsWebInfResource("test-ds.xml", "test-ds.xml");
       }
      
       @SuppressWarnings("unchecked")
       @Test
       public void testSimpleJPALuceneSearch() {
        log.info("testSimpleJPALuceneSearch");
      
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
      
        // create native Lucene query using the query DSL
        // alternatively you can write the Lucene query using the Lucene query
        // parser
        // or the Lucene programmatic API. The Hibernate Search DSL is
        // recommended though
        QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
        org.apache.lucene.search.Query luceneQuery = qb.keyword().onFields("title", "subTitle", "authors.name")
          .matching("Programmers").createQuery();
      
        // wrap Lucene query in a javax.persistence.Query
        javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Book.class);
      
        // execute search
        List<Book> result = (List<Book>) jpaQuery.getResultList();
      
        log.info("Record found=" + result.size());
        result.forEach(p -> log.info(p.toString()));
      
        assertEquals(9, result.size());
       }
      
       @SuppressWarnings("unchecked")
       @Test
       public void testMoreLikeThis() {
        Book book = em.find(Book.class, 14);
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
      
        QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
        org.apache.lucene.search.Query luceneQuery = qb.moreLikeThis().comparingFields("subTitle")
          .toEntity(book).createQuery();
        javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Book.class);
      
        // execute search
        List<Book> result = (List<Book>) jpaQuery.getResultList();
      
        log.info("Record found=" + result.size());
        result.forEach(p -> log.info(p.toString()));
      
        assertEquals(5, result.size());
       }
      
      }
And we are done. To run the arquillian test execute: mvn clean test -Parq-wildfly-managed. This comes from the javaee7 archetype.

The project code is available at github repository: https://github.com/czetsuya/hibernate-search-demo.
Hibernate with infinispan tutorial for beginners Hibernate with infinispan tutorial for beginners Reviewed by Edward Legaspi on Thursday, May 04, 2017 Rating: 5

No comments:

Powered by Blogger.