JPA 2 上的列表与设置 - 优点 / 缺点 / 方便

Posted

技术标签:

【中文标题】JPA 2 上的列表与设置 - 优点 / 缺点 / 方便【英文标题】:List vs Set on JPA 2 - Pros / Cons / Convenience 【发布时间】:2014-10-16 13:23:03 【问题描述】:

我曾尝试在 Stack Overflow 和其他网站上搜索使用 SetsLists 的优缺点和便利,但我真的找不到明确的答案什么时候用这个或那个。

从 Hibernate 的文档中,他们声明不重复的记录应该进入 Sets 并且从那里,您应该为每个可以包装的单个实体实现 hashCode() 和 equals() 设置。但随之而来的是便利性和易用性的代价,因为有一些文章建议使用业务密钥作为每个实体的 id,从那里,hashCode() 和 equals() 可以在每种情况下完美实现无论对象的状态如何(托管、分离等)。

一切都很好,一切都很好......直到我遇到很多使用 Sets 不可行的情况,例如 Ordering(尽管 Hibernate 给了你 的想法>SortedSet)、collectionObj.get(index)、collectionObj.remove(int location || Object obj)的便利性、android的ListView/ExpandableListView(GroupIds, ChildIds)等架构...我的观点是:Sets 操作起来真的很糟糕(恕我直言)并使其 100% 发挥作用。

我很想将我项目的每个集合都更改为 List,因为它们运行良好。我所有实体的 ID 都是通过 mysql 的自动生成序列 (@GeneratedValue(strategy = GenerationType.IDENTITY)) 生成的。

在上面提到的所有这些小细节中,有没有人可以明确地清除我的想法?

另外,对每个实体的 ID 字段使用 Eclipse 自动生成的 hashCode() 和 equals() 是否可行?它在任何情况下都有效吗?

非常感谢,

雷纳托

【问题讨论】:

列出.v。 Set 与 JPA2 关系不大。它是关于您在应用程序中需要什么。 JPA2 处理两者 ID 在大多数情况下不是业务密钥,而是合成密钥。所以你最后一个问题的答案是否定的,因为这样做是完全错误的。 Neil 已经回答了 List v Set。 【参考方案1】:

一个列表,如果没有指定索引列,将被 Hibernate 当作一个包处理(没有特定的排序)。

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Hibernate 处理的一个显着区别是您不能在单个查询中获取两个不同的列表。例如,如果您有一个包含联系人列表和地址列表的 Person 实体,您将无法使用单个查询来加载人员及其所有联系人和所有地址。这种情况下的解决方案是进行两个查询(避免笛卡尔积),或者对至少一个集合使用 Set 而不是 List。

当您必须在实体上定义 equals 和 hashCode 并且在实体中没有不可变的功能键时,通常很难将 Sets 与 Hibernate 一起使用。

此外,我建议您link。

【讨论】:

您提供的链接提供了有关 Set vs List 困境的优秀信息。但是你能给我一些关于 mysql 主键生成和 hashCode 和 equals 的正确实现的见解吗?另外,我接受你的答案是正确的。谢谢 @Renatinn 很高兴为您提供帮助 :) .. 无论如何我建议您使用另一个 link 来解释 hashCode 和 equals 的正确实现:) 这个答案只是复制from another question? 只是来自***.com/questions/6562673/… 的副本。敬业【参考方案2】:
List versus Set

允许重复 列表允许重复,集合不允许重复。对于某些人来说,这将是他们选择 List 或 Set 的主要原因。

Multiple Bag's Exception - 在同一个查询中多次 Eager fetch 处理 Hibernate 的一个显着区别是您不能在单个查询中获取两个不同的列表。 它将抛出异常“无法获取多个包”。但是有了套装,就没有这样的问题了。

【讨论】:

很好的答案,但 Xstian 的答案更完整。谢谢

以上是关于JPA 2 上的列表与设置 - 优点 / 缺点 / 方便的主要内容,如果未能解决你的问题,请参考以下文章

程序员的笔记与开发工具推荐

TensorFlow的优势和缺点都有哪些

迭代器

记录到 syslog 与文件系统:优点和缺点

JPA双向关系的优缺点

Git从青铜到王者第五篇:服务器上的 Git 协议