I'm having a problem where Hibernate-search is not persisting fields, since the Lucene index is empty.
I have already researched this forum, and found clues about transactions being related to the problem.
Yet all posts are using much earlier versions of Spring and Hibernate-search.
I'm not sure what to try next... Please help!
I'm using the following versions of Hibernate and Spring:
<hibernate-search-version>3.2.0.Final</hibernate-search-version>
<hibernate-validator-version>4.0.2.GA</hibernate-validator-version>
<hibernate-annotations-version>3.3.1.GA</hibernate-annotations-version>
<springframework-version>3.0.2.RELEASE</springframework-version>
My Configuration is as follows:
app-context.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/b ... ns-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/c ... xt-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/t ... tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/j ... 22-3.0.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<context:annotation-config/>
<context:component-scan base-package="net.resumage.core"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
<property name="persistenceUnitName" value="resumage"></property>
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="${jpa.database}"
p:showSql="${jpa.showSql}"
p:generateDdl="${jpa.generateDdl}"/>
//embedded data-source for now
<jdbc:embedded-database id="dataSource"></jdbc:embedded-database>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
Then my Persistence.xml is
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/ ... ce_1_0.xsd"
version="1.0">
<persistence-unit name="resumage" transaction-type="RESOURCE_LOCAL">
<!--todo: set ORM.xml file or figure out how to auto scan it-->
<class>net.resumage.core.domain.Resume</class>
<class>net.resumage.core.domain.ResumePoster</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!--Hibernate Search Configuration-->
<property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
<property name="hibernate.search.default.indexBase" value="/tmp/resumage/indexes"></property>
<!--Hibernate Properties-->
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.cache.use_structured_entries" value="true"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.use_sql_comments" value="false"/>
<property name="hibernate.jdbc.batch_size" value="30"/>
</properties>
</persistence-unit>
</persistence>
This is my test file:
@ContextConfiguration(locations = {"domainTest-context.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class ResumePosterHibernateSearchTests
{
@PersistenceContext
private EntityManager em;
private ResumePoster resumePoster;
private Resume resume;
@Test
@Transactional
public void testFindIndexedPlainTextContent() throws ParseException
{
QueryParser parser = new QueryParser(Version.LUCENE_29, "plainTextContent", new StandardAnalyzer(Version.LUCENE_29));
String searchQuery = "plainTextContent:plain";
org.apache.lucene.search.Query luceneQuery = parser.parse(searchQuery);
FullTextEntityManager ftem = getFullTextEntityManager(em);
// attempt to explicit index - does not work either
// Resume reference = em.getReference(Resume.class, resume.getId());
// ftem.index(reference);
// ftem.flush();
FullTextQuery textQuery = ftem.createFullTextQuery(luceneQuery, Resume.class);
List resultList = textQuery.getResultList();
assertEquals(1, resultList.size());
assertEquals(resumePoster, resultList.iterator().next());
}
@Transactional
@Before
public void setup()
{
resumePoster = new ResumePoster();
resumePoster.setEmailAddress("bogus@gmail.com");
resume = new Resume();
resume.setPlainTextContent("this is plain text content phrase for testing purposes");
resumePoster.addResume(resume);
em.persist(resumePoster);
em.flush();
em.clear();
}
My test fails because it does not find the indexed content. Using Luke I can confirm no documents are there.
here is my log,
2010-06-13 18:48:30,031 INFO [org.hibernate.cfg.AnnotationBinder] - <Binding entity from annotated class: net.resumage.core.domain.Resume>
2010-06-13 18:48:30,062 INFO [org.hibernate.cfg.annotations.EntityBinder] - <Bind entity net.resumage.core.domain.Resume on table Resume>
2010-06-13 18:48:30,093 INFO [org.hibernate.cfg.AnnotationBinder] - <Binding entity from annotated class: net.resumage.core.domain.ResumePoster>
2010-06-13 18:48:30,093 INFO [org.hibernate.cfg.annotations.EntityBinder] - <Bind entity net.resumage.core.domain.ResumePoster on table ResumePoster>
2010-06-13 18:48:30,140 INFO [org.hibernate.cfg.annotations.CollectionBinder] - <Mapping collection: net.resumage.core.domain.ResumePoster.resumes -> Resume>
2010-06-13 18:48:30,140 INFO [org.hibernate.cfg.AnnotationConfiguration] - <Hibernate Validator not found: ignoring>
2010-06-13 18:48:30,156 INFO [org.hibernate.validator.util.Version] - <Hibernate Validator 4.0.2.GA>
2010-06-13 18:48:30,156 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] - <Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.>
2010-06-13 18:48:30,218 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] - <Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.>
2010-06-13 18:48:30,218 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] - <Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.>
2010-06-13 18:48:30,234 INFO [org.hibernate.connection.ConnectionProviderFactory] - <Initializing connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider>
2010-06-13 18:48:30,234 INFO [org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider] - <Using provided datasource>
2010-06-13 18:48:30,390 INFO [org.hibernate.cfg.SettingsFactory] - <RDBMS: HSQL Database Engine, version: 1.8.0>
2010-06-13 18:48:30,390 INFO [org.hibernate.cfg.SettingsFactory] - <JDBC driver: HSQL Database Engine Driver, version: 1.8.0>
2010-06-13 18:48:30,406 INFO [org.hibernate.dialect.Dialect] - <Using dialect: org.hibernate.dialect.HSQLDialect>
2010-06-13 18:48:30,406 INFO [org.hibernate.engine.jdbc.JdbcSupportLoader] - <Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4>
2010-06-13 18:48:30,406 INFO [org.hibernate.transaction.TransactionFactoryFactory] - <Transaction strategy: org.hibernate.transaction.JDBCTransactionFactory>
2010-06-13 18:48:30,406 INFO [org.hibernate.transaction.TransactionManagerLookupFactory] - <No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Automatic flush during beforeCompletion(): disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Automatic session close at end of transaction: disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <JDBC batch size: 30>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <JDBC batch updates for versioned data: disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Scrollable result sets: enabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <JDBC3 getGeneratedKeys(): disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Connection release mode: auto>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Default batch fetch size: 1>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Generate SQL with comments: disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Order SQL updates by primary key: disabled>
2010-06-13 18:48:30,406 INFO [org.hibernate.cfg.SettingsFactory] - <Order SQL inserts for batching: disabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory>
2010-06-13 18:48:30,421 INFO [org.hibernate.hql.ast.ASTQueryTranslatorFactory] - <Using ASTQueryTranslatorFactory>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Query language substitutions: {}>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <JPA-QL strict compliance: enabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Second-level cache: enabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Query cache: disabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Optimize cache for minimal puts: disabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Structured second-level cache entries: enabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Echoing all SQL to stdout>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Statistics: enabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Deleted entity synthetic identifier rollback: disabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Default entity-mode: pojo>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Named query checking : enabled>
2010-06-13 18:48:30,421 INFO [org.hibernate.cfg.SettingsFactory] - <Check Nullability in Core (should be disabled when Bean Validation is on): disabled>
2010-06-13 18:48:30,437 INFO [org.hibernate.search.Version] - <Hibernate Search 3.2.0.Final>
2010-06-13 18:48:30,453 DEBUG [org.hibernate.search.impl.InitContext] - <Using default similarity implementation: org.apache.lucene.search.DefaultSimilarity>
2010-06-13 18:48:30,515 DEBUG [org.hibernate.search.engine.DocumentBuilderIndexedEntity] - <Field selection in projections is set to true for entity net.resumage.core.domain.Resume.>
2010-06-13 18:48:30,515 DEBUG [org.hibernate.search.engine.DocumentBuilderIndexedEntity] - <Field selection in projections is set to true for entity net.resumage.core.domain.ResumePoster.>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 DEBUG [org.hibernate.search.event.FullTextIndexEventListener] - <Hibernate Search event listeners activated>
2010-06-13 18:48:30,578 INFO [org.hibernate.impl.SessionFactoryImpl] - <building session factory>
2010-06-13 18:48:30,703 INFO [org.hibernate.impl.SessionFactoryObjectFactory] - <Not binding factory to JNDI, no JNDI name configured>
2010-06-13 18:48:30,703 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] - <Running hbm2ddl schema update>
2010-06-13 18:48:30,703 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] - <fetching database metadata>
2010-06-13 18:48:30,718 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] - <updating schema>
2010-06-13 18:48:30,718 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] - <Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.>
2010-06-13 18:48:30,734 INFO [org.hibernate.tool.hbm2ddl.DatabaseMetadata] - <table not found: Resume>
2010-06-13 18:48:30,734 INFO [org.hibernate.tool.hbm2ddl.DatabaseMetadata] - <table not found: ResumePoster>
2010-06-13 18:48:30,734 INFO [org.hibernate.tool.hbm2ddl.DatabaseMetadata] - <table not found: Resume>
2010-06-13 18:48:30,734 INFO [org.hibernate.tool.hbm2ddl.DatabaseMetadata] - <table not found: ResumePoster>
2010-06-13 18:48:30,734 INFO [org.hibernate.tool.hbm2ddl.SchemaUpdate] - <schema update complete>
2010-06-13 18:48:30,828 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Creating new transaction with name [testFindIndexedPlainTextContent]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''>
2010-06-13 18:48:30,843 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@13a1778] for JPA transaction>
2010-06-13 18:48:30,875 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@1a6b16f]>
2010-06-13 18:48:30,875 INFO [org.springframework.test.context.transaction.TransactionalTestExecutionListener] - <Began transaction (1): transaction manager [org.springframework.orm.jpa.JpaTransactionManager@127ff0d]; rollback [true]>
2010-06-13 18:48:30,906 DEBUG [org.hibernate.SQL] - <insert into ResumePoster (resume_poster_id, created, emailAddress, version) values (null, ?, ?, ?)>
Hibernate: insert into ResumePoster (resume_poster_id, created, emailAddress, version) values (null, ?, ?, ?)
2010-06-13 18:48:30,921 DEBUG [org.hibernate.SQL] - <call identity()>
Hibernate: call identity()
2010-06-13 18:48:30,921 DEBUG [org.hibernate.SQL] - <insert into Resume (resume_id, created, plainTextContent, resume_poster_id, searchable, version) values (null, ?, ?, ?, ?, ?)>
Hibernate: insert into Resume (resume_id, created, plainTextContent, resume_poster_id, searchable, version) values (null, ?, ?, ?, ?, ?)
2010-06-13 18:48:30,921 DEBUG [org.hibernate.SQL] - <call identity()>
Hibernate: call identity()
2010-06-13 18:48:30,968 DEBUG [org.hibernate.SQL] - <select resume0_.resume_id as resume1_0_0_, resume0_.created as created0_0_, resume0_.plainTextContent as plainTex3_0_0_, resume0_.resume_poster_id as resume6_0_0_, resume0_.searchable as searchable0_0_, resume0_.version as version0_0_ from Resume resume0_ where resume0_.resume_id=?>
Hibernate: select resume0_.resume_id as resume1_0_0_, resume0_.created as created0_0_, resume0_.plainTextContent as plainTex3_0_0_, resume0_.resume_poster_id as resume6_0_0_, resume0_.searchable as searchable0_0_, resume0_.version as version0_0_ from Resume resume0_ where resume0_.resume_id=?
2010-06-13 18:48:31,000 DEBUG [org.hibernate.search.reader.SharingBufferReaderProvider] - <Opening IndexReader for directoryProviders: 1>
2010-06-13 18:48:31,015 DEBUG [org.hibernate.search.reader.SharingBufferReaderProvider] - <Closing MultiReader: org.hibernate.search.reader.CacheableMultiReader@196bac4>
2010-06-13 18:48:31,015 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Initiating transaction rollback>
2010-06-13 18:48:31,015 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@13a1778]>
2010-06-13 18:48:31,015 DEBUG [org.springframework.orm.jpa.JpaTransactionManager] - <Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@13a1778] after transaction>
2010-06-13 18:48:31,015 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] - <Closing JPA EntityManager>
2010-06-13 18:48:31,015 INFO [org.springframework.test.context.transaction.TransactionalTestExecutionListener] - <Rolled back transaction after test execution for test context [[TestContext@1a9bea3 testClass = ResumePosterHibernateSearchTests, locations = array<String>['classpath:/net/resumage/core/domain/domainTest-context.xml'], testInstance = net.resumage.core.domain.ResumePosterHibernateSearchTests@122cc7e, testMethod = testFindIndexedPlainTextContent@ResumePosterHibernateSearchTests, testException = java.lang.AssertionError: expected:<1> but was:<0>]]>
2010-06-13 18:48:31,015 INFO [org.springframework.context.support.GenericApplicationContext] - <Closing org.springframework.context.support.GenericApplicationContext@1abab88: startup date [Sun Jun 13 18:48:29 PDT 2010]; root of context hierarchy>
2010-06-13 18:48:31,031 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - <Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1313906: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,luceneVersionConfig,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,transactionManager,entityManagerFactory,jpaAdapter,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,luceneVersion]; root of factory hierarchy>
2010-06-13 18:48:31,031 INFO [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] - <Closing JPA EntityManagerFactory for persistence unit 'resumage'>
2010-06-13 18:48:31,031 INFO [org.hibernate.impl.SessionFactoryImpl] - <closing>
Process finished with exit code -1
java.lang.AssertionError: expected:<1> but was:<0>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)