Сбой индексации для незагруженной коллекции сущностей и прерывание транзакции с LazyInitializationException - PullRequest
0 голосов
/ 15 ноября 2018

Я загружаю сущность в свой пользовательский интерфейс, меняю несколько вещей и обновляю свою сущность новой транзакцией, но Hibernate Search перехватывает в моей транзакции и пытаюсь обновить поисковый индекс. Это было бы найти, за исключением того, что он пытается загрузить коллекцию, которая помечена @IndexedEmbedded(), которая не использовалась, и поэтому выдает LazyInitializationException.

Как я могу предотвратить это?

Caused by: org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion) 
    at org.hibernate.search.event.impl.EventSourceTransactionContext$DelegateToSynchronizationOnBeforeTx.doBeforeTransactionCompletion(EventSourceTransactionContext.java:173) 
    at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:954) 
    at org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:525) 
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2480) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:98) 
        ... 76 common frames omitted 
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.foo.Bar, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:597) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:216) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:576) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:147) 
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:188) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFieldsForEmbeddedObjects(DocumentBuilderIndexedEntity.java:553) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFields(DocumentBuilderIndexedEntity.java:482) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFieldsForEmbeddedObjects(DocumentBuilderIndexedEntity.java:593) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFields(DocumentBuilderIndexedEntity.java:482) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.getDocument(DocumentBuilderIndexedEntity.java:402) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.createAddWork(DocumentBuilderIndexedEntity.java:299) 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.addWorkToQueue(DocumentBuilderIndexedEntity.java:241) 
    at org.hibernate.search.engine.impl.WorkPlan$PerEntityWork.enqueueLuceneWork(WorkPlan.java:560) 
    at org.hibernate.search.engine.impl.WorkPlan$PerClassWork.enqueueLuceneWork(WorkPlan.java:322) 
    at org.hibernate.search.engine.impl.WorkPlan.getPlannedLuceneWork(WorkPlan.java:188) 
    at org.hibernate.search.backend.impl.WorkQueue.prepareWorkPlan(WorkQueue.java:115) 
    at org.hibernate.search.backend.impl.BatchedQueueingProcessor.prepareWorks(BatchedQueueingProcessor.java:55) 
    at org.hibernate.search.backend.impl.PostTransactionWorkQueueSynchronization.beforeCompletion(PostTransactionWorkQueueSynchronization.java:67) 
    at org.hibernate.search.event.impl.EventSourceTransactionContext$DelegateToSynchronizationOnBeforeTx.doBeforeTransactionCompletion(EventSourceTransactionContext.java:170) 
        ... 84 common frames omitted

1 Ответ

0 голосов
/ 16 ноября 2018

Когда это происходит, обычно это означает, что вы закрыли сеанс, который использовался для загрузки объекта, и попытались обновить объект, используя другой сеанс.Это происходит в некоторых средах, где по какой-то причине вам нужно сериализовать объекты между загрузкой и фактическим обновлением.

Самое простое решение: не отсоединяйте и не используйте объекты в разных сеансах, это простопринести вам головную больИ я говорю не только о Hibernate Search.

Если вы действительно хотите это сделать, возможно , но не так очевидно, как может показаться на первый взгляд.

Есть способы избежать использования отдельных сущностей в Wicket, по крайней мере.Для других фреймворков, не зная больше о вашей фреймворке, я не могу помочь.Я сомневаюсь, что смогу помочь, если это пользовательский интерфейс, которого я не знаю, но это стоит попробовать;)

Если вы решите предоставить больше информации, пожалуйста, по крайней мере, упомяните: версии Hibernate ORM и Hibernate Search, которые вывы используете, и точный код, который вы используете при взаимодействии с Session / EntityManager (.persist(), .merge(), .saveOrUpdate(), ...), и код пользовательского интерфейса, связанный с хранением / переносом объекта между компонентами.

...