在flush()之后,JPA/Hibernate惰性加载列表为空



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


我有四个实体,都有FetchType.LAZY:

  • AddressEntity
  • StudentEntity->具有List<AddressEntity>fetch = FetchType.LAZY, cascade = CascadeType.ALL
  • CourseEntity->具有List<AttendingEntity>fetch = FetchType.LAZY, cascade = CascadeType.ALL
  • AttendingEntity->具有对StudentEntityAddressEntity的引用(必须是学生的(&CourseEntity-全部与fetch = FetchType.LAZY, cascade = CascadeType.PERSIST

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

然而,如果我在获取CourseEntity之后调用entitymanger的flush((方法,但BEFORE触发课程的AttendingEntity列表的延迟加载,JPA仍然会加载出席列表并触发每个学生的延迟加载。but对于AddressEntity的学生列表不会触发延迟加载,并且学生的地址列表的大小始终为零。


有人知道为什么冲洗看起来像";中断";这里的懒惰装载?

这是预期的行为吗?

我的注释是否错误,或者是否需要设置其他注释/属性?

提前很多!

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

public StudentEntity 
{
// ...
@OneToMany(...)
private List<AddressEntity> = new ArrayList<>;
}

不知怎的,这似乎是";混淆";在一些惰性负载期间休眠。当我删除new ArrayList<>时,问题似乎得到了解决。

编辑:我找到了"官方的";hibernate错误https://hibernate.atlassian.net/browse/HHH-14549

这听起来像是一个bug。请在问题跟踪器中创建问题(https://hibernate.atlassian.net)带有测试用例(https://github.com/hibernate/hibernate-test-case-templates/blob/master/orm/hibernate-orm-5/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java)它再现了这个问题。

最新更新