В настоящее время я конвертирую существующий проект 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 о загрузке ленивых атрибутов при доступе (и Я не хочу вручную распаковывать каждый ленивый атрибут из моего приложения).
У кого-нибудь есть решение для этого?
Большое спасибо!