/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.embedded; import static org.junit.Assert.assertEquals; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.OneToOne; import org.apache.lucene.search.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.annotations.ContainedIn; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.testsupport.TestForIssue; import org.junit.Test; /** * @author Yoann Rodiere */ @TestForIssue(jiraKey = "HSEARCH-2486") public class ContainedInEntityInheritanceTest extends SearchTestBase { @Test public void testContainedInIsInherited() { // Initialize Containing containing; try (Session session = openSession()) { Transaction transaction = session.beginTransaction(); containing = new Containing(); session.save( containing ); Contained contained = new Contained(); containing.contained = contained; contained.containing = containing; session.save( contained ); session.save( containing ); transaction.commit(); } assertEquals( 1, queryResultSize( 0 ) ); // Update and test the containedIn try (Session session = openSession()) { Transaction transaction = session.beginTransaction(); containing = session.byId( Containing.class ).load( containing.id ); containing.contained.field = 1; session.save( containing.contained ); transaction.commit(); } assertEquals( 1, queryResultSize( 1 ) ); assertEquals( 0, queryResultSize( 0 ) ); } private int queryResultSize(int fieldValue) { try (Session session = openSession()) { FullTextSession ftSession = Search.getFullTextSession( session ); QueryBuilder builder = ftSession.getSearchFactory().buildQueryBuilder() .forEntity( Containing.class ).get(); Query luceneQuery = builder.keyword().onField( "contained.field" ).matching( fieldValue ).createQuery(); FullTextQuery query = ftSession.createFullTextQuery( luceneQuery, Containing.class ); return query.getResultSize(); } } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { Containing.class, AbstractContained.class, Contained.class }; } @Indexed @Entity private static class Containing { @Id @GeneratedValue private long id; @OneToOne @IndexedEmbedded private Contained contained; } @MappedSuperclass private static class AbstractContained { @OneToOne(mappedBy = "contained") @ContainedIn Containing containing; @Field int field; } /** * This entity doesn't carry any Search specific annotation, * but its superclass does. */ @Entity private static class Contained extends AbstractContained { @Id @GeneratedValue private long id; } }