Hibernate:最佳集合类型 – 包,idbag,set,list,map

在Hibernate中进行一对多关联时,我正在寻找大多数人用作收集类型的东西。 我维护的遗留应用程序专门使用行李,但将它们保存为代码中的列表。 相关的表有一个id字段,所以idbag似乎更合适,但文档推荐一个Set。

编辑:我错误地引用了文档推荐的集合。 实际上,官方文档在所有集合类型上同样含糊不清。 我发现有些 网站似乎推断Set是最常见的,我正在阅读的Hibernate书明确说明了这些集:

这是典型Hibernate应用程序中最常见的持久性集合。 (参见:Christian Bauer和Gavin King撰写的’Java Persistence with Hibernate’第242页)

我猜这就是扔给我的东西,让我找出别人正在使用的东西。

EDIT2:请注意,Gavin King是Hibernate的创建者

根据使用两者的经验,我建议使用List。 如果您从数据库中获取数据并显示/操作它,那么它几乎总是需要保持一致的顺序。 您可以使用SortedSet,但与仅添加订单并将其存储在List中相比,可以添加整个世界的痛苦(覆盖equals,hashcode等以及以不同方式排序)。 列表更易于操作 – 如果用户删除页面上的第3行,则只需删除列表中的第3项。 使用Set似乎涉及许多不必要的代码并且使用迭代器搞乱。

当我使用带有Hibernate的Sets时,我经常发现自己在几周之后将所有套件翻录并用Lists替换,因为套件给了我太多限制。

Hibernate文档和第三方工具似乎默认使用Sets,但是从硬体验中我发现使用Lists更有效率。

好吧,经过一段时间后,我发现了一个不使用Set作为集合类型的理由。 由于hashcode / equals覆盖的问题以及hibernate持续存在的方式,使用任何调用hashcode / equals的java API函数都是一个坏主意。 没有好的方法可以持续比较持久化前后的对象。 坚持使用不依赖于equals / hashcode的集合。

更多信息:

http://community.jboss.org/wiki/EqualsandHashCode (此链接使其听起来像是一个商业密钥,但是请完整阅读下一个链接,看看为什么这并不总是一个好主意)

https://forum.hibernate.org/viewtopic.php?f=1&t=928172 (阅读整个讨论,让你的头脑旋转)

我猜人们会使用各种各样的东西:-) – 不同的收集类型有不同的用途,所以“最好的”收集类型取决于你需要它。

也就是说,在代码中使用List通常比使用Set更方便,即使所述List是无序的。 如果没有别的,’。(0)’在眼睛上比.iterator().next() :-)更容易Hibernate包支持绝对足以达到此目的,你甚至可以添加一个order-by声明(如果适用)并列出您的清单。

idbag是用于多对多关联的完全不同的动物; 你无法将它与常规的Set或List进行比较。

我建议使用一个集合,因为一个集合被定义为一组独特的项目,这通常是你处理的内容。

并且.iterator().next()在您的集合中没有元素时保存。

如果访问空列表, .get(0)可能会抛出IndexOutOfBoundsException