Hibernate with infinispan tutorial for beginners

This tutorial is for developers who are just beginning to learn hibernate-search and trying to set up a demo project. Most of the codes are ...

This tutorial is for developers who are just beginning to learn hibernate-search and trying to set up a demo project. Most of the codes are copied from the 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 the 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

    <property name="hibernate.show_sql" value="true" />
    <!-- Enables second level cache, call find after insert and no query in the database will be issue -->
    <property name="hibernate.cache.use_second_level_cache" value="false"/>
    <!-- Enable query cache -->
    <property name="hibernate.cache.use_query_cache" value="false"/>
    <!-- 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.

Note: If you want to cache the result of a query, set hint:

TypedQuery query = em.createQuery("from Entity", Entity.class);
query.setHint("org.hibernate.cacheable", Boolean.TRUE);
List events = query.getResultList();


The project code is available at Github repository: https://github.com/czetsuya/hibernate-search-demo.

COMMENTS

mas template
Name

amazon,1,angular,8,bigdata,2,business,1,course-spring,27,courses,6,database,4,docker,3,java,50,kafka,1,keycloak,4,microservices,5,mysql,1,neworking,1,nosql,2,php,1,pinned,2,react,3,server management,7,shared drive,1,spring,7,synology,1,troubleshooting,2,web,1,wordpress,1,
ltr
item
toztech: Hibernate with infinispan tutorial for beginners
Hibernate with infinispan tutorial for beginners
toztech
https://toztech.blogspot.com/2017/05/hibernate-with-infinispan-tutorial-for.html
https://toztech.blogspot.com/
https://toztech.blogspot.com/
https://toztech.blogspot.com/2017/05/hibernate-with-infinispan-tutorial-for.html
true
2554149350007112447
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content