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.
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:
- 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> - Create a class Author and Book from hibernate search documentation.
- 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> - Now let's create an arquillian test:
- arquillian.xml
<?xml version="1.0" encoding="UTF-8"?>
Set jbossHome to the correct value.
<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> - 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());
}
}
Note: If you want to cache the result of a query, set hint:
TypedQueryquery = em.createQuery("from Entity", Entity.class);
query.setHint("org.hibernate.cacheable", Boolean.TRUE);
Listevents = query.getResultList();
The project code is available at Github repository: https://github.com/czetsuya/hibernate-search-demo.
0 nhận xét:
Đăng nhận xét