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

Nem*_*emi 11 java hibernate

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

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

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

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

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

Coo*_*ino 12

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

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

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


Nem*_*emi 9

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

更多信息:

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

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


Chs*_*y76 5

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

也就是说,List在代码中使用通常比使用更方便,Set即使所说的List是无序的.如果不出意外,".get(0)"在眼睛上比以下更容易.iterator().next():-) Hibernate包支持绝对足以满足此目的,你甚至可以添加order-by声明(如果适用)并对列表进行排序.

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