首页 > 解决方案 > JPA/Hibernate 延迟加载列表在 flush() 后为空

问题描述

我遇到了一个非常奇怪的 JPA/Hibernate (v5.4.28) 问题,并希望有人能给我一个提示如何解决这个问题。这个场景解释起来有点复杂,但我会尽量简化它。


我有四个实体,全部带有FetchType.LAZY

我正在CourseEntity使用 entitymanger 从数据库中获取 a 并使用 getter 来访问各种嵌套实体。由于它们都是通过链接链接的,@ManyToOne或者@OneToMany我可以通过获取课程的 antending 列表、获取学生然后在地址列表上调用 get 来获取每个学生的地址。

CourseEntity但是,如果我在获取但在触发课程列表的延迟加载之前调用实体管理器的 flush() 方法AttendingEntity,JPA 仍然会加载参加列表并为每个学生触发延迟加载,不会触发延迟加载学生列表AddressEntity和学生地址列表的大小始终为零。


有没有人知道为什么刷新似乎“破坏”了这里的延迟加载?

这是预期的行为吗?

我的注释是错误的还是我需要设置另一个注释/属性?

提前很多!

标签: hibernatejpa

解决方案


我终于弄清楚了导致这种行为的原因(尽管我仍然不确定这是预期的行为还是错误)。显然问题是我初始化了实体中的所有实例变量列表,例如

public StudentEntity 
{
   // ...

    @OneToMany(...)
    private List<AddressEntity> = new ArrayList<>;
}

不知何故,这似乎在一些延迟加载期间“混淆”了 Hibernate。当我删除new ArrayList<>该问题似乎已解决。

编辑:我也发现了“官方”休眠错误 https://hibernate.atlassian.net/browse/HHH-14549


推荐阅读