Java Hibernate:最好使用的集合类型-包、idbag、集合、列表、地图

Java Hibernate:最好使用的集合类型-包、idbag、集合、列表、地图,java,hibernate,Java,Hibernate,我正在寻找大多数人在Hibernate中进行一对多关联时使用的集合类型。我维护的遗留应用程序只使用包,但将它们作为列表保存在代码中。相关联的表有一个id字段,因此idbag似乎更合适,但文档建议使用一组 编辑:我错误地引用了文档推荐的集合。事实上,官方文件对所有收集类型都同样模糊。我发现似乎可以推断集合是最常见的,而我正在阅读的Hibernate书籍明确地提到了集合: 这是典型Hibernate应用程序中最常见的持久性集合。(请参阅Christian Bauer和Gavin King的“Java

我正在寻找大多数人在Hibernate中进行一对多关联时使用的集合类型。我维护的遗留应用程序只使用包,但将它们作为列表保存在代码中。相关联的表有一个id字段,因此idbag似乎更合适,但文档建议使用一组

编辑:我错误地引用了文档推荐的集合。事实上,官方文件对所有收集类型都同样模糊。我发现似乎可以推断集合是最常见的,而我正在阅读的Hibernate书籍明确地提到了集合:

这是典型Hibernate应用程序中最常见的持久性集合。(请参阅Christian Bauer和Gavin King的“Java持久化与Hibernate”第242页)

我想这就是我被抛弃的原因,让我发现别人在用什么


EDIT2:请注意,Gavin King是Hibernate的创建者,我猜人们使用各种各样的东西:-)-不同的收藏类型有不同的用途,所以“最好”的一种取决于你需要它做什么

也就是说,在代码中使用
List
通常比使用
Set
更方便,即使所述
List
是无序的。如果没有其他东西,“.get(0)”比
.iterator().next()
:-)Hibernate包支持显然足以满足此目的,而且您甚至可以添加
order by
声明(如果适用)并对列表进行排序


是一种用于多对多联想的完全不同的动物;你无法将其与常规集合或列表进行比较。

我建议使用集合,因为集合被定义为唯一项的集合,这通常是你要处理的

当集合中没有元素时,
.iterator().next()
将被保存


如果访问空列表,
.get(0)
可能会引发
索引自动边界异常

好的,经过一段时间后,我找到了不将集合用作集合类型的原因。由于hashcode/equals重写的问题以及hibernate的持久化方式,使用任何调用hashcode/equals的javaapi功能都不是一个好主意。在持久化之前和之后,没有一致地比较对象的好方法。坚持使用不依赖equals/hashcode的集合,如
bag

更多信息请点击此处:

(这个链接听起来像是一个商业关键,但仔细阅读下一个链接,看看为什么这并不总是一个好主意)


(阅读整个讨论让你头晕目眩)

根据使用这两种方法的经验,我建议使用列表。如果要从数据库中获取数据并对其进行显示/操作,则几乎总是需要以一致的顺序保存数据。您可以使用SortedSet,但与仅通过添加订单并将其存储在列表中相比,这会增加整个世界的痛苦(覆盖equals、hashcode等,并以不同的方式进行排序)。列表更易于操作-如果用户删除页面上的第3行,则只需删除列表中的第3项即可。使用集合似乎涉及大量不必要的代码和迭代器

当我将集合与Hibernate一起使用时,我经常发现自己在几周后撕掉所有集合,并替换为列表,因为集合给了我太多的限制


Hibernate文档和第三方工具在默认情况下似乎使用集合,但根据艰苦的经验,我发现使用列表更有效。

chssly76说:“在代码中使用列表通常比使用集合更方便,即使所述列表是无序的。如果没有其他东西,'.get(0)'比.iterator().next()更容易理解。”-我同意这一点,当所有文档都建议设置时,这让我感到很沮丧。我只是想看看其他人在使用什么,以及它是否与文档不符。谢谢。你一直在说“文档推荐集”。你能提供一个具体的链接吗?我不认为Hibernate文档推荐一种集合类型胜过另一种(怎么可能?);它只描述了各种可用的映射。关于收藏的章节中没有一个“推荐”字:@chssly76-你当然是对的。请看我上面的编辑。尽管官方文档不推荐集合,但Hibernate的创建者加文·金(Gavin King)所写的书确实说集合是最常见的。回答不错!性能方面呢,它们之间有什么区别吗?光线。。。想试试吗<代码>迭代器().hasNext()是安全的<代码>迭代器()。下一步()肯定不是。当然,您可以使用迭代器hasNext方法来检查,但您永远不知道元素在列表中的哪个位置。您也可以检查列表是否为空(通过
isEmpty()
,这也是更可读的)。我不知道你所说的“哪个位置”是什么意思——看看你是如何比较列表和设置的,你的列表是无序的。最后,这是一个品味的问题。但通常情况下,你处理的是一个集合所设计的独特的无序项。我的印象是集合是被推荐的,或者是因为HibernateTools反向工程工具几乎完全使用集合创建了我的POJO域对象。