У меня есть приложение Spring, использующее Hibernate и подключенное к Elasticsearch через Hibernate-Search.
Чтобы упростить пример, я добавлю только необходимые аннотации и код.
У меня естьсущность A , содержащаяся в нескольких B сущностях (много, на самом деле ~ 8000).
B сущности также содержит много встроенных деталей (сущностей) C , E , ...).
Все эти объекты связаны с @ IndexedEmbedded и @ ContainedIn Hibernate-Searchаннотации (см. пример ниже).
Я создал службу, изменив поле объекта A и принудительно сбросив flushToIndexes .
При сбросе Hibernate-Search обновляет индекс A , а из-за @ ContainedIn распространяется по индексам 8000 B .Но для обновления индексов B , по какой-то причине, Hibernate-Search загружает каждый 8000 B объектов, связанных с объектом A одновременно, а также все детали, содержащиеся в нем.в B объектах ( C , E и т. д.).
Все это занимает много времени и заканчивается не более чем java.lang.OutOfMemoryError: Пространство кучи Java .
@Entity
@Table(name = "A")
@Indexed
public class A {
@ContainedIn
@OneToMany(fetch = FetchType.LAZY, mappedBy = "a")
private Set<B> bCollection;
@Field
@Column(name = "SOME_FIELD")
private String someField; // Value updated in the service
}
@Entity
@Table(name = "B")
@Indexed
public class B {
@IndexedEmbedded
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID")
private A a;
@IndexedEmbedded
@OneToOne(fetch = FetchType.LAZY, mappedBy = "b")
@Fetch(FetchMode.JOIN)
private C c; // Some other details
@IndexedEmbedded
@OneToMany(fetch = FetchType.LAZY, mappedBy = "b")
private Set<E> eCollection; // Some other details
}
// My service
aObject.setSomeField("some value");
fullTextSession.flushToIndexes();
Увеличение выделенной памяти JVM (с 8 ГБ до 24ГБ, что на самом деле много для ~ 10000 объектов) ничего не решило.Поэтому я предполагаю, что загрузка всего набора данных требует более 24 ГБ ...
Однако проблема кажется более сложной, чем выглядит ~
Это ошибка?Это распространено?Что я сделал не так ?Как я могу решить это?
Есть ли какая-то скрытая конфигурация Hibernate-Search, чтобы избежать такого поведения?