3

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

4

4 回答 4

3

“JPA 中的多袋提取问题”

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

于 2011-12-06T13:46:08.610 回答
1

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

  1. 不要急于获取;
  2. 使用 FetchMode.SELECT 强制选择提取(仍然渴望但没有连接提取);或者
  3. 将结果散列到一个集合中。建议设置方法,前提是您绝对需要始终附加上述集合。即使有额外的散列步骤,join fetch 的性能也比 select fetch 好,这几乎没有任何成本。
于 2012-09-28T19:45:36.007 回答
1

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

于 2011-12-06T10:41:12.500 回答
0

考虑将集合映射为列表而不是包。这是通过添加@org.hibernate.annotations.IndexColumnor 来完成的,因为 JPA 2.0,prefer@javax.persistence.OrderColumn

于 2012-10-02T16:19:35.393 回答