Спящие ленивые отношения извлекаются n + 1 без вызова свойств - Котлин - PullRequest
0 голосов
/ 09 октября 2018

Я использую 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, и приложение автоматически создает схему и создает некоторые фиктивные данные назапускать.Так что довольно легко приступить к работе.

Я очень надеюсь, что кто-нибудь подскажет мне, что происходит.

Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны open классы сущностей.Hibernate требует open классов для создания прокси для поддержки полей LAZY - ManyToOne:

@Entity
open class Apartment(
    @Id
    private val id: String,
    private val heading: String,
    @ManyToOne(fetch = LAZY)
    private val building: Building
)

@Entity
open class Building(
    @Id
    private val id: String,
    private val heading: String,
    @ManyToOne(fetch = FetchType.LAZY)
    private val owner: User
)

@Entity
@Table(name="users")
open class User(
    @Id
    private val id: String,
    private val email: String
)

Вы также можете использовать all-open -Plugin .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...