Hibernate Search, LazyInitializationException e teste funcional

1 resposta
marceltessarini

Olá, estou com o seguinte problema. Tenho uma entidade chamada Person e ela tem uma lista de AcademicHistoryItem, este OneToMany está configurado como Lazy,
fiz este mapeamento, pois estou usando Hibernate Search e precisava procurar por Person através de palavras chave referentes a AcademicHistoryItem,

por exemplo, “Ciência da Computação”, “Graduação”, “Mestrado”, etc.

Não quero e não preciso usar Eager nesta relação.

O Hibernate Search indexa corretamente e tudo funciona bem no sistema. O probleam está nos testes funcionais que eu tenho, são vários.

Os testes funcionais que estão dando problema tem a seguinte estrutura:

@Test
public void testAlgumTeste() {

gerarDados(); // massa de dados para fazer o  teste
[color=red]endTransaction();[/color]
// fazer login
// faz o teste

}

Antes de executar qualquer teste, um navegador é aberto para executar as instruções do teste (uso Selenium para gerar o código). Porém, para que o navegador seja capaz de ver os dados gerados em gerarDados() é necessário encerrar a transação e isto só acontece quando o teste termina OU eu faço um endTransaction() dentro dele.

Em algum momento da execução de [color=red]endTransaction();[/color], o Hibernate Search tenta reindexar Person e para isso ele faz um person.getAcademicHistoryItem() e aí eu recebo uma exceção (que está no fim do texto).

É possível fazer alguma configuração, tal que quando person.getAcademicHistoryItem() for executado, independente de estar dentro da sessão ou não, a coleção seja carregada?

org.springframework.orm.hibernate3.HibernateSystemException: Error while indexing in Hibernate Search (before transaction completion); nested exception is org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)

at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676)

at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:789)

at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:663)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)

at org.springframework.test.AbstractTransactionalSpringContextTests.endTransaction(AbstractTransactionalSpringContextTests.java:355)

at functional.showColleagues.SearchByCourseTest.initializeData(SearchByCourseTest.java:607)

at functional.showColleagues.SearchByCourseTest.testGetPersonByTagCourse_cienciaDaComputacao2000(SearchByCourseTest.java:94)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at junit.framework.TestCase.runTest(TestCase.java:168)

at junit.framework.TestCase.runBare(TestCase.java:134)

at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)

at junit.framework.TestResult$1.protect(TestResult.java:110)

at junit.framework.TestResult.runProtected(TestResult.java:128)

at junit.framework.TestResult.run(TestResult.java:113)

at junit.framework.TestCase.run(TestCase.java:124)

at junit.framework.TestSuite.runTest(TestSuite.java:232)

at junit.framework.TestSuite.run(TestSuite.java:227)

at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Caused by: org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)

at org.hibernate.search.backend.impl.EventSourceTransactionContext$DelegateToSynchronizationOnBeforeTx.doBeforeTransactionCompletion(EventSourceTransactionContext.java:162)

at org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:530)

at org.hibernate.engine.ActionQueue.beforeTransactionCompletion(ActionQueue.java:211)

at org.hibernate.impl.SessionImpl.beforeTransactionCompletion(SessionImpl.java:563)

at org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion(JDBCContext.java:229)

at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:142)

at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)

 25 more

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.ujima.alumni.model.roles.Person.academicHistoryItens, no session or session was closed

at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)

at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)

at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)

at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)

at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.buildDocumentFields(DocumentBuilderIndexedEntity.java:470)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.getDocument(DocumentBuilderIndexedEntity.java:414)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.createAddWork(DocumentBuilderIndexedEntity.java:364)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.addWorkToQueue(DocumentBuilderIndexedEntity.java:348)

at org.hibernate.search.engine.DocumentBuilderContainedEntity.addWorkForEmbeddedValue(DocumentBuilderContainedEntity.java:738)

at org.hibernate.search.engine.DocumentBuilderContainedEntity.processSingleContainedInInstance(DocumentBuilderContainedEntity.java:721)

at org.hibernate.search.engine.DocumentBuilderContainedEntity.processContainedInInstances(DocumentBuilderContainedEntity.java:676)

at org.hibernate.search.engine.DocumentBuilderContainedEntity.addWorkToQueue(DocumentBuilderContainedEntity.java:624)

at org.hibernate.search.engine.DocumentBuilderIndexedEntity.addWorkToQueue(DocumentBuilderIndexedEntity.java:359)

at org.hibernate.search.backend.impl.BatchedQueueingProcessor.addWorkToBuilderQueue(BatchedQueueingProcessor.java:264)

at org.hibernate.search.backend.impl.BatchedQueueingProcessor.processWorkByLayer(BatchedQueueingProcessor.java:251)

at org.hibernate.search.backend.impl.BatchedQueueingProcessor.prepareWorks(BatchedQueueingProcessor.java:149)

at org.hibernate.search.backend.impl.PostTransactionWorkQueueSynchronization.beforeCompletion(PostTransactionWorkQueueSynchronization.java:85)

at org.hibernate.search.backend.impl.EventSourceTransactionContext$DelegateToSynchronizationOnBeforeTx.doBeforeTransactionCompletion(EventSourceTransactionContext.java:159)

 31 more

1 Resposta

Williansmartins

Estou com um problema relacionado a este assunto,

Estou pesquisando em todos os lugares possíveis, já acionei 4 amigos especialistas em java, certificados e tudo mais.
Lancei perguntas em forum, baixei o manual do Hibernate Search, estou pirando aqui e ninguém tem idéia de como resolver.
Só preciso fazer o reload do arquivo de sinônimos (synonimus.txt) depois dele ser alterado (em ambiente de produção, sem precisar reiniciar o servidor).

Alguém tem alguma referência, alguem que eu possa ligar, uma idéia de como fazer isso?

Criado 3 de setembro de 2010
Ultima resposta 3 de jan. de 2013
Respostas 1
Participantes 2