我遇到了一个非常奇怪的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
->具有对StudentEntity
、AddressEntity
的引用(必须是学生的(&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)它再现了这个问题。