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
。
- 当Hibernate刷新会话时,它如何判断会话中的哪些对象是脏的?
- 如何拦截Hibernate生成的SQL?
- Lombok @builder在一个扩展另一个类的类上
- getSingleResult在hibernate中返回本机标量查询的代理
- Hibernate未知实体(不缺少@Entity或导入javax.persistence.Entity)
- 什么是Hibernate的MariaDB方言类名?
- 为什么我得到org.hibernate.id.IdentifierGenerationException?
- Hibernate 3.5.x:NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval
- Hibernate映射具有空值的复合键