首页 文章

使用fetch join或EAGER解决hibernate multi-bag-fetch-issue问题?

提问于
浏览
3

我有一个A类,它与B和C类有一对多的关系 . 我把fetchType设置为EAGER,这导致了JPA中的多包取问题 . 现在有两种方法可以解决我所知道的问题 . 要么我保持获取类型Eager并将它们从List更改为Set,这在我的情况下是正常的,或者将fetchType更改为“lazy”并使用join查询到EAGER获取关系 . 推荐的方法是什么?

4 回答

  • 0

    “JPA中的多包取问题”

    请注意,它们不是“JPA中的多包提取问题”,这是Hibernate的一个特定问题 . 其他JPA提供程序没有此问题,JPA完全允许您拥有多个EAGER OneToMany关系 .

  • 3

    我更喜欢获取集合(尽管在查询中存在单个提取的限制,如果你使用hibernate),因为你有时希望列出所有A对象而不想要B&C的更改 . 我个人主要使用列表我想直接将集合显示到jsf数据表(无法处理集合),并且我不得不通过在后端手动读取集合来初始化集合,而不是在它不仅仅是单个集合时获取它们 .

  • 1

    在急切的集合提取中,Hibernate默认“交叉连接”您的根和集合表 . 这可能会导致返回重复的根元素,这可能是您不想要的 . 三种可能的解决方

    • 不要急于取;

    • 使用FetchMode.SELECT强制选择获取(仍然渴望但没有连接获取);要么

    • 将结果哈希到一个Set中 . 建议设置方法,只要您始终需要附加所述集合 . 即使使用额外的散列步骤,连接提取的性能也优于选择提取,这实际上几乎没有成本 .

  • 1

    考虑将集合映射为列表而不是包 . 这是通过添加 @org.hibernate.annotations.IndexColumn 来完成的,或者,因为JPA 2.0,更喜欢 @javax.persistence.OrderColumn

相关问题