Я использую hibernate и делаю простой запрос, чтобы выбрать все заданные объекты.Я хочу только сущность, а не ее отношения.Однако hibernate извлекает отношения и отношения отношений способом n + 1.
Это приложение Spring Boot, написанное на Kotlin.
Отношения аннотированы с помощью FetchType.LAZYи запрос, который я делаю, выглядит следующим образом:
entityManager.createQuery("SELECT a FROM Apartment a")
.resultList
Это единственный код, который я вызываю, и я даже не возвращаю результаты из контроллера, поэтому это не какая-то библиотека сериализации, которая вызываетленивые свойства.
Это сущности:
@Entity
class Apartment(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = LAZY)
private val building: Building
)
@Entity
class Building(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = FetchType.LAZY)
private val owner: User
)
@Entity
@Table(name="users")
class User(
@Id
private val id: String,
private val email: String
)
Я включил ведение журнала запросов Hibernate, и когда я запускаю запрос выше, он выглядит так:
Fetch all apartments
Fetch buildings for apartment 1
Fetch users for building 1
fetch buildings for apartment 2
fetch users for building 2
....
Я создал репозиторий git, который воспроизводит проблему: https://github.com/Herlevsen/hibernate-lazy-fetch-repoduction
Он поставляется с файлом docker-compose, который запускает базу данных postgres, и приложение автоматически создает схему и создает некоторые фиктивные данные назапускать.Так что довольно легко приступить к работе.
Я очень надеюсь, что кто-нибудь подскажет мне, что происходит.
Спасибо!