В своем проекте столкнулся с ошибкой StackOverflowError при ленивой загрузке.
Проблема воспроизводится в специфической ситуации, когда кэшируемая сущность загружается через entityManager, а после делается запрос через dataManager, который загружает в том числе эту сущность. В таком случае изначальная сущность меняет статус с managed на detached и при загрузке ленивых коллекций происходит StackOverflowError.
Я создал тестовый проект который воспроизводит эту проблему. Для воспроизведения нужно запустить тест Test1.
@Transactional
public void method(UUID entityOne) {
EntityOne managed = entityManager.find(EntityOne.class, entityOne);
EntityTwo entityTwo1 = managed.getEntityThreeTest().getEntityTwo();
List list = dataManager.load(EntityOne.class).all().list();
entityTwo1.getEntityThrees().size();
}
Требуется много стечений обстоятельств для того, чтобы получить эту ошибку, но это реальный пример проекта с множеством модулей и делая запрос в одном модуле, ты не хочешь оказывать эффект на сущности которые уже были загружены в других модулях.
К тому же managed сущность после dataManager.load(EntityOne.class).all().list(); становится detached, что тоже неожиданно и тоже может вызывать проблемы.
Ошибка появилась именно в 2.8.1 - в 2.8.0 её нет. Я проверил это на своём проекте с тестами, где условия достаточно изолированы.
В 2.8.0 всё работает корректно. В 2.8.1 при включённом кешировании сущности возникает StackOverflowError. Если отключить кеширование, StackOverflowError пропадает, но вместо него начинают появляться многочисленные unfetched ошибки для embeddable-полей. Причём эти ошибки выглядят плавающими и возникают нестабильно.
При этом в 2.8.0 даже с отключённым кешированием таких ошибок нет. Из этого можно предположить, что в 2.8.1 было внесено изменение, которое ломает не только конкретный сценарий, описанный в этой задаче, но и в целом влияет на корректность механизма загрузки сущностей.
В тестовом примере воспроизвести unfetched ошибку мне не удалось.
Мне кажется, что эта задача приоритетнее, чем ее оценили