Kotlin-调用getter时未加载Hibernate代理



我目前正在将一个现有的Java项目转换为Kotlin,并且遇到了一些关于Hibernate Lazy Loading行为的问题。

在以下数据模型中(简化(:

@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
}

Lazy Loading似乎按预期工作(当我查询Parent时,child属性由HibernateProxy的子类表示,而在数据库中,不查询Child表(。

但是,当我在应用程序中运行parent.child时,Hibernate不会加载子级。这意味着:如果我调用parent.child.whateverAttributeFromChildwhateverAttributeFromChild将为NULL(因为它没有加载(。

我找不到一种方法来告诉Hibernate在访问时加载懒惰属性(我不想手动取消对应用程序中每个懒惰属性的代理(。

有人能解决这个问题吗?

非常感谢!

找到解决方案:

除了@Entity类本身的open关键字之外,所有属性也应该是open!当将open关键字添加到Child.whateverAttributeFromChild属性时,延迟加载工作如预期!

所以别忘了打开你的属性!!

最新更新