我目前正在将一个现有的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.whateverAttributeFromChild
,whateverAttributeFromChild
将为NULL(因为它没有加载(。
我找不到一种方法来告诉Hibernate在访问时加载懒惰属性(我不想手动取消对应用程序中每个懒惰属性的代理(。
有人能解决这个问题吗?
非常感谢!
找到解决方案:
除了@Entity
类本身的open
关键字之外,所有属性也应该是open
!当将open
关键字添加到Child.whateverAttributeFromChild
属性时,延迟加载工作如预期!
所以别忘了打开你的属性!!