LazyInitializationException(有时)带有“左连接提取”查询

时间:2019-04-04 10:03:33

标签: spring hibernate jpa spring-data-jpa

一个非常奇怪的LazyInitializationException,它偶尔会发生。

@Entity
class Document {

    @Id
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "document", cascade = CascadeType.ALL)
    private Set<Summary> summaries = new HashSet<>();
}

@Entity
class Summary {

    @Id
    private Long id;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private Document document;
}

我使用@Query方法中的以下JpaRepository

@Query("select distinct d from Document d left join fetch d.summaries where d.id in (:idList)")

对于id中一组非常特定的idList,当尝试访问LazyInitializationException中特定summaries的{​​{1}}集合时,我得到id查询返回了{1}}个。例如,查询返回5个Document(让Documents的第1、2、3、4、5条说),并且仅在其中一个中,id集合会引发异常(将其删除)。是summariesDocument)。另一个id = 2的集合中填充有条目或为空(如果该文档没有摘要)。

事实1 :引发异常的DocumentsDocument)应该将此集合设为空(此文档没有摘要)。

事实2 :仅针对给定的特定id:2引发异常。如果从该列表中删除了idList(但受影响的id(2)仍在列表中),则不会引发异常。例如。通过ididList: {1, 2, 3, 4}{2, 3, 4, 5}等不会抛出{1, 2, 5}

这是LIE的讨厌的错误吗?经过Hibernate5.2.17.Final

的测试

0 个答案:

没有答案