Kotlin - HibernateProxy не загружается при вызове геттера - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я конвертирую существующий проект Java в Kotlin и сталкиваюсь с некоторыми проблемами, связанными с поведением отложенной загрузки Hibernate.

В следующей модели данных (упрощенно):

@Entity
open class Parent
{
    @Id
    @GeneratedValue
    var id: Long = 0

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "parent", cascade = [CascadeType.ALL], optional = false)
    open var child = Child(this)
}

@Entity
open class Child(@MapsId
                 @OneToOne(fetch = FetchType.LAZY)
                 @JoinColumn(name = "parent_id", insertable = false, updatable = false)
                 val parent: Parent)
{
    @Id
    private val parentId: Long = 0

    // Its actual type is not relevant, as long as it is not a primitive type
    var whateverAttributeFromChild: AnyComplexType
}

Ленивая загрузка, кажется, работает как ожидалось (когда я запрашиваю Parent, атрибут child представляется подклассом HibernateProxy, а в базе данных таблица Child не запрашивается).

Однако, когда я запускаю parent.child в своем приложении, Hibernate не загружает дочерний элемент. Это означает: если я вызову parent.child.whateverAttributeFromChild, whateverAttributeFromChild будет иметь значение NULL (потому что он не загружен).

Я не могу найти способ сообщить Hibernate о загрузке ленивых атрибутов при доступе (и Я не хочу вручную распаковывать каждый ленивый атрибут из моего приложения).

У кого-нибудь есть решение для этого?

Большое спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Нашел решение:

Кроме ключевого слова open в самом классе @Entity, ВСЕ атрибуты также должны быть open! При добавлении ключевого слова open к атрибуту Child.whateverAttributeFromChild отложенная загрузка работала должным образом!

Так что не забудьте открыть свои атрибуты !!

...