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

时间:2011-12-06 10:32:21

标签: hibernate jpa join one-to-many eager

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

3 个答案:

答案 0 :(得分:3)

“JPA中的多包提取问题”

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

答案 1 :(得分:1)

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

  1. 不要急于获取;
  2. 使用FetchMode.SELECT强制选择提取(仍然渴望但没有连接提取);或
  3. 将结果哈希到一个Set中。建议设置方法,只要您始终需要附加所述集合。即使使用额外的散列步骤,连接提取的性能也优于选择提取,这实际上几乎没有成本。

答案 2 :(得分:0)

考虑将集合映射为列表而不是包。这是通过添加@org.hibernate.annotations.IndexColumn或从JPA 2.0开始,更喜欢@javax.persistence.OrderColumn

来完成的