hibernate - JPA/Hibernate 延迟加载列表在 flush() 后为空
问题描述
我遇到了一个非常奇怪的 JPA/Hibernate (v5.4.28) 问题,并希望有人能给我一个提示如何解决这个问题。这个场景解释起来有点复杂,但我会尽量简化它。
我有四个实体,全部带有FetchType.LAZY
:
AddressEntity
StudentEntity
-> 有一个List<AddressEntity>
withfetch = FetchType.LAZY, cascade = CascadeType.ALL
CourseEntity
-> 有一个List<AttendingEntity>
withfetch = FetchType.LAZY, cascade = CascadeType.ALL
AttendingEntity
-> 引用了StudentEntity
,AddressEntity
(必须是学生的其中一个)&CourseEntity
- 全部带有fetch = FetchType.LAZY, cascade = CascadeType.PERSIST
我正在CourseEntity
使用 entitymanger 从数据库中获取 a 并使用 getter 来访问各种嵌套实体。由于它们都是通过链接链接的,@ManyToOne
或者@OneToMany
我可以通过获取课程的 antending 列表、获取学生然后在地址列表上调用 get 来获取每个学生的地址。
CourseEntity
但是,如果我在获取但在触发课程列表的延迟加载之前调用实体管理器的 flush() 方法AttendingEntity
,JPA 仍然会加载参加列表并为每个学生触发延迟加载,但不会触发延迟加载学生列表AddressEntity
和学生地址列表的大小始终为零。
有没有人知道为什么刷新似乎“破坏”了这里的延迟加载?
这是预期的行为吗?
我的注释是错误的还是我需要设置另一个注释/属性?
提前很多!
解决方案
我终于弄清楚了导致这种行为的原因(尽管我仍然不确定这是预期的行为还是错误)。显然问题是我初始化了实体中的所有实例变量列表,例如
public StudentEntity
{
// ...
@OneToMany(...)
private List<AddressEntity> = new ArrayList<>;
}
不知何故,这似乎在一些延迟加载期间“混淆”了 Hibernate。当我删除new ArrayList<>
该问题似乎已解决。
编辑:我也发现了“官方”休眠错误 https://hibernate.atlassian.net/browse/HHH-14549
推荐阅读
- c# - Unable to export RSA private parameters when running as administrator
- apache-spark - Spark 未使用所有可用的 CPU
- unity3d - HoloLens/Unity shared experience: How to track a user's "world" position instead of Unity's position?
- java - Regex split paragraph by period followed by newline (Arabic Text)
- python - Speeding up small minibatches on a GPU
- prolog - Prolog 中真正的尾递归 modInverse()
- python - 在字符串之间使用环境变量?
- java - 为什么没有收到 ACTION_USER_PRESENT?
- api - 基于身份验证、最佳实践的 REST API 响应?
- java - 将evey计算存储为数组中的项目